上一篇《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()的入口处设置断点。<br> (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 <br> 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,未来还会折腾更多东西,不死不休。
感谢大家的关注,期待与你一起成长。
【SunLogging】
扫码二维码,关注微信公众号,阅读更多精彩内容