命令 | 缩写 | 作用 | 备注 |
---|---|---|---|
run | r | 重启程序 | Ctrl + C 可让 GDB 中断 |
continue | c 或 cont | 继续程序 | Ctrl + C 中断后,用 c 恢复 |
break | b | 设置断点 | 见 break 部分 |
info break | i b | 显示当前所有断点信息 | —— |
backtrace | bt | 查看当前调用堆栈 | —— |
frame | f 堆栈编号 | 切换到其他堆栈处 | f 4 : 切换到编号 #4 |
list | l | 输出上一次list命令显示的代码后面的代码 | 如果是第一次执行list命令 则会显示当前正在执行代码位置附近的代码 |
print param | p | 查看变量的值 | p a |
whatis val | - | 查看变量类型 | ptype val,作用和 whatis 类似 |
info thread | - | 查看当前进程的所有线程运行情况 | thread 线程编号,可切换到具体编号的线程上 输出的线程号前面带 * 号的是当前所在线程 eg: thread 3 |
next | n | 单步执行 | 遇到函数直接跳过,不进入函数内部 |
step | s | 单步执行 | 遇到函数会进入函数内部。 |
return | 立即退出当前函数 | 剩下的代码不会执行了 | |
finish | 退出当前函数 | 继续执行完该函数剩余代码再正常退出 | |
until | 与 break 类似 | —— | |
jump | 跳转 | ||
disassemble | 查看汇编指令 | disassemble thread_2 | |
set args | 见参考 | ||
watch | 监视一个变量或者一段内存 | 当这个变量或者内存的值发生变化时,GDB就会中断下来 |
使用“info address function_name”来查找函数地址。例如,如果您想查找名为“test”的函数的地址,您可以在gdb中输入“info address test”
您可以使用gdb中的“examine”命令(简写为“x”)来查看指定内存地址处的内容。命令格式为“x/nfu ”,其中“n”表示需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的“u”定义;“f”表示显示格式。例如,如果您想查看地址0x7fffffffd708处的内容,您可以在gdb中输入“x/1xb 0x7fffffffd708”
您可以在gdb中使用以下命令来查看函数“thread_2”的汇编代码:
(gdb) disassemble thread_2
(gdb) n
316 printf("main: hello world\n");
表示下一个要运行的是316行
- disable 断点编号:禁用某个断点,使得断点不会被触发
- enable 断点编号:启用某个被禁用的断点
- delete 断点编号:删除某个断点。
- jump LineNo:跳转到代码的 LineNo 行的位置
- jump +10:跳转到距离当前代码下10行的位置
- jump *0x12345678:跳转到 0x12345678 地址的代码处,地址前要加星号;
注意
- 中间跳过的代码是不会执行的;
- 跳到的位置后如果没有断点,那么GDB会自动继续往后执行;
用GDB调试多线程程序时,该程序的编译需要添加 -lpthread
参数。
break
用法 | 说明 | 举例 | 例子说明 |
---|---|---|---|
break FunctionName | 在函数的入口处添加一个断点 | b main | 在 main 函数入口点设置断点 |
break LineNo | 在当前文件行号为LineNo处添加断点 | b 100 | 在当前文件的 第100行 设置断点 |
break FileName:LineNo | 在FileName文件行号为LineNo处添加一个断点 | b anet.c:441 | 在anet.c文件 第 441 行设置断点 |
break FileName:FunctionName | ~ | b test.c:main | 在test.c文件的 main 函数入口点设置断点 |
break -/+offset | 在当前程序暂停位置的前/后 offset 行处下断点 | b +100 | ~ |
list
用法 | 说明 |
---|---|
list - | 显示上一次list命令显示的代码前面的代码 |
list LineNo | 显示当前代码文件第 LineNo 行附近的代码 |
list FileName:LineNo | 显示 FileName 文件第 LineNo 行附近的代码 |
list FunctionName | 显示 当前文件的 FunctionName 函数附近的代码 |
list FileName:FunctionName | 显示 FileName 文件的 FunctionName 函数附件的代码 |
list from,to | 显示这之间的代码 |
show listsize | 查看 list 命令显示的代码行数 |
set listsize count | 设置 list 命令显示的代码行数为 count |
list *$pc
当前运行处
- print param=value :用于在调试过程中修改变量的值;
- print a+b+c:可以进行一定的表达式计算,这里是计算a、b、c三个变量之和;
- print func():输出func函数执行的结果,常见的用途是打印系统函数执行失败原因:print strerror(errno);
- print *this:在c++对象中,可以输出当前对象的各成员变量的值;