gdb带参调试

在GDB中根据参数进入函数断点,核心是使用break(或b)命令结合if条件。语法为:break 函数名 if 参数名==值。这会在函数被调用且特定参数满足条件时暂停程序,适用于条件排查。
 
1. 设置方法
  • 基本语法: (gdb) b FunctionName if ParamName == Value 
  • 示例: 若要调试 process_data 函数,且仅当参数 id 等于 100 时暂停:
    bash
    (gdb) break process_data if id == 100
  • 对于特定类型的参数:
    • 指针/字符串: (gdb) b func if strcmp(name, "target") == 0
    • 结构体成员: (gdb) b func if st.member == 1
 
2. 其他场景断点设置
  • 在该函数第一次进入时: (gdb) b func
  • 在指定文件的函数: (gdb) b source.c:func
  • 对现有断点添加条件: 使用 condition 命令。
    bash
    (gdb) b 10  # 假设断点号为1
    (gdb) condition 1 id == 100
 
3. 注意事项
  • 带调试信息: 确保编译时使用 -g 参数,否则无法识别函数参数。
  • 断点位置: 建议在函数入口设置断点以确保能捕获参数值。
  • 查看参数: 断点触发后,使用 info args 查看当前函数的所有参数值。
在GDB中跳跃代码执行位置(跳过或重复执行某段代码)主要使用 jump (或 j) 命令,可直接改变程序计数器(PC)到指定位置,而不需要手动单步执行。若要跳过断点多次才暂停,则使用 ignore 命令。 
1. jump 命令实现直接跳跃(往前/往后)
  • 语法: jump <location>
  • 描述: 将程序执行流直接强制跳转到 <location>,可以是行号、函数名或 +offset / -offset。 
  • 示例: 
    • jump 20: 跳到当前文件的第20行继续执行。
    • jump +5: 跳过当前位置后的5行代码。
    • jump -10: 跳回到当前位置前10行重新执行。
    • jump filename.c:30: 跳转到指定文件的第30行。
 
注意:直接跳转可能会绕过必要的初始化代码(如变量赋值),导致程序状态不一致或崩溃。
 
2. ignore 命令跳过前面的断点
如果是在调试循环或多次调用的函数,想让断点在第N次之后才暂停,不建议使用jump,而是使用 ignore。 
  • 语法: ignore <breakpoint-number> <count>
  • 示例:
    • b 10: 在第10行设置断点(假设断点编号为 1)。
    • ignore 1 30: 忽略断点1接下来的30次触发,第31次触发时暂停。
 
3. 临时修改执行路径
通过 jump 后,程序会从新位置继续执行,直到遇到新的断点或程序结束。
此外,如果需要在启动程序时传入参数,使用 (gdb) set args arg1 arg2。

第一种方法:为程序传递参数5

root@guo-virtual-machine:~/debug# gdb --args factorial 5

第二种方法:为程序传递参数5

(gdb) run 5

方法三:

(gdb) set args 5

(gdb) run

打印方法

常用方法
假设有以下数组:uint8_t data[10] = {0x01, 0x02, 0x03};
  1. 直接打印数组值(推荐)
    使用 @ 操作符打印数组指针的内容:
    bash
    (gdb) p *data@10
    $1 = {1, 2, 3, 0, 0, 0, 0, 0, 0, 0}
    
  2. 以十六进制格式打印(推荐用于二进制数据)
    使用 p/x 以十六进制显示,更直观:
    bash
    (gdb) p/x *data@10
    $2 = {0x1, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}
    
  3. 使用 x 命令查看内存(适合大数据块)
    x/nbu:n=数量,b=字节(byte),u=无符号十六进制:
    bash
    (gdb) x/10xb data
    0x7fffffffe400: 0x01    0x02    0x03    0x00    0x00    0x00    0x00    0x00
    0x7fffffffe408: 0x00    0x00
 
进阶技巧
  • 格式化输出:使用 set print array on 可让数组元素换行显示,清晰明了。
  • 打印字符串内容:如果数组包含字符,可用 p (char*)data。 
 
总结
 
场景命令
快速查看数值 p *array@len
十六进制查看 p/x *array@len
内存块分析 x/nbx array
posted @ 2019-03-20 20:56  PKICA  阅读(98)  评论(0)    收藏  举报