Linux C++ 开发7 - GDB常用命令汇总(你想了解的都在这)
上一篇《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: 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。(2). until 行号: 运行至某行,不仅仅用来跳出循环。 | |
| jump | j | 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。 | 
| call | (1). 调用程序中可见的函数,并传递“参数”。 (2). 使用方法举例: call gdb_test(55)。 | |
| quit | q | 退出gdb | 
2. 设置断点
| 命令 | 缩写 | 说明 | 
|---|---|---|
| break n | b n | 在第n行处设置断点。 | 
| break filename:n | b filename:n | (1). 在 filename的第n行设置断点。(2). 举例: b company.cpp:578 | 
| break func | b func | (1). 在函数func()的入口处设置断点。 (2). 举例: break cb_button | 
| break filename:func | b filename:func | (1). 在 filename的func函数处设置断点。(2). 举例: b Department.hpp:Department::GetPerson;表示在 Department.hpp的Department类的GetPerson成员函数设置断点。 | 
| info breakpoints | info bi 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】
 
扫码二维码,关注微信公众号,阅读更多精彩内容
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号