上一篇《Linux C++ 开发6 - GDB调试》中我们讲解了GDB的调试流程和常用的调试方法。GDB的调试指令众多,我们这里针对常用的指令做一个汇总(按功能分类),以便需要时进行查阅。
1. 运行命令
命令 | 缩写 | 说明 |
---|---|---|
run | r | 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。 |
start | 开始执行程序,停在main函数第一行语句前面等待命令。 | |
continue | c | 继续执行,到下一个断点处(或运行结束) |
next | n | 单步跟踪程序,当遇到函数调用时,也不进入此函数体 |
step | s | 单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数 |
return | 结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。 | |
finish | fi | 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 |
until | (1). until : 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。<br/> (2). until 行号 : 运行至某行,不仅仅用来跳出循环。 | |
jump | j | 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。 |
call | (1). 调用程序中可见的函数,并传递“参数”。<br/> (2). 使用方法举例:call gdb_test(55) 。 | |
quit | q | 退出gdb |
2. 设置断点
命令 | 缩写 | 说明 |
---|---|---|
break n | b n | 在第n行处设置断点。 |
break filename:n | b filename:n | (1). 在filename 的第n行 设置断点。<br/> (2). 举例:b company.cpp:578 |
break func | b func | (1). 在函数func()的入口处设置断点。 (2). 举例: break cb_button |
break filename:func | b filename:func | (1). 在filename 的func函数 处设置断点。<br/> (2). 举例: b Department.hpp:Department::GetPerson ;<br/> 表示在Department.hpp 的Department 类的GetPerson 成员函数设置断点。 |
info breakpoints | info b i b | 显示所有断点设置情况 |
disable n | 禁用第n个断点 | |
enable n | 启用第n个断点 | |
delete n | d n | 删除第n个断点 |
clear n | 清除第n行的断点 | |
delete breakpoints | d breakpoints | 清除所有断点 |
3. 查看源码
命令 | 缩写 | 说明 |
---|---|---|
list | l | 列出程序的源代码,默认每次显示10行。 |
list n | l n | 列出当前文件以“第n行”为中心的前后10行代码,如:list 12 |
list +n | l +n | 显示距当前所在行后n行处的源程序。 |
list -n | l -n | 显示距当前所在行前n行处的源程序。 |
list func | l func | 显示func函数 所在位置的源代码,如:list main |
list | l | 不带参数,将接着上一次 list 命令的,输出下边的内容。 |
list . | l . | 列出当前所在文件开始位置的代码。 |
list filename:n | l filename:n | 列出filename文件第n行位置的代码,如:l Department.hpp:30 |
4. 打印表达式
命令 | 缩写 | 说明 |
---|---|---|
print a | p a | 打印变量a 的值。 |
print ++a | p ++a | 将把a 中的值加1,并打印出来。 |
print add(2, 3) | p add(2, 3) | 调用函数add ,并传递参数(2, 3) ,打印函数执行结果。 |
print add(a, b) | p add(a, b) | 调用函数add ,并将变量a 、b 传递给函数(a, b) ,打印函数执行结果。 |
display expression | 每次程序暂停时显示指定表达式(expression )的值。 | |
watch expression | 设置一个监视点,一旦被监视的表达式(expression )的值改变,gdb将强行终止正在被调试的程序。如: watch a 。 | |
whatis | 查询变量或函数,如:whatis add ; whatis a 。 | |
info function | 列出函数列表。 | |
info locals | 打印当前堆栈页的所有变量。 |
5. 查看运行信息
命令 | 缩写 | 说明 |
---|---|---|
backtrace | bt | 显示当前调用堆栈。 |
where /info stack | bt 的功能完全相同, 显示当前调用堆栈。 | |
up | 在调用堆栈中向上移动,即切换到调用当前函数的上一层堆栈帧。 | |
down | 在调用堆栈中向下移动,即切换到被当前函数调用的下一层堆栈帧。 | |
frame n | f n | 选择当前堆栈的第n帧。 |
set args | 用于设置程序运行时的参数。这些参数将传递给程序的 main 函数,类似于在命令行中运行程序时传递的参数。参见下面的Demo。 | |
show args | 用于查看当前设置的程序运行时参数。这些参数将传递给程序的 main 函数,类似于在命令行中运行程序时传递的参数。 | |
info program | 来查看程序的是否在运行,进程号,被暂停的原因。 |
5.1. 设置和查看运行参数的Demo
demo03.cpp:
#include <iostream>
int main(int argc, char* argv[])
{
for (int i = 0; i < argc; ++i)
{
std::cout << "argument " << i << ": " << argv[i] << std::endl;
}
return 0;
}
编译demo03.cpp:
g++ -g ./demo03.cpp -o ./demo03.out
调试并运行:
gdb -q ./demo03.out
Reading symbols from ./demo03.out...
# 设置运行参数
(gdb) set args arg1 arg2
# 显示运行参数
(gdb) show args
Argument list to give program being debugged when it is started is "arg1 arg2".
# 运行程序
(gdb) r
Starting program: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out arg1 arg2
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
argument 0: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out
argument 1: arg1
argument 2: arg2
[Inferior 1 (process 323) exited normally]
上面这种通过set args
的方式设置参数,与下面这种通过--args
的方式是一样的。
# 也可以使用 --args 选项来设置参数
gdb -q --args ./demo03.out arg1 arg2
Reading symbols from ./demo03.out...
# 运行程序
(gdb) r
Starting program: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out arg1 arg2
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
argument 0: /mnt/d/workspace/blog/source/_posts/cpp_linux/demo/demo03.out
argument 1: arg1
argument 2: arg2
[Inferior 1 (process 549) exited normally]
6. 分割窗口
layout
指令用于分割窗口,可以一边查看代码,一边调试。
命令 | 说明 |
---|---|
layout src | 显示源代码窗口。 |
layout asm | 显示反汇编窗口。 |
layout regs | 显示源代码/反汇编和CPU寄存器窗口。 |
layout split | 显示源代码和反汇编窗口。 |
Ctrl + L | 刷新窗口 |
7. 参考文档
https://blog.csdn.net/niyaozuozuihao/article/details/91802994
大家好,我是陌尘。
IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。
搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。
感谢大家的关注,期待与你一起成长。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。