gdb调试常见命令详细总结

gdb调试常见命令

    • 运行(run/continue/next/step/until/finish/call/quit)
    • 断点
          • 显示当前程序的断点设置情况
          • 设置断点(在某个函数入口或指定行号处)
          • 暂停设置的断点(可再次开启)
          • 清除断点(delete/clear)
    • 函数堆栈中进行调试
          • 对于当前状态(可以是发生崩溃后)返回上/下一层调用函数
          • 查看当前调用函数堆栈列表
          • 跳转到堆栈中的某个函数
    • 打印信息
          • set命令传参或修改参数值进行调试
          • 查看某个变量或者表达式的值
          • 查看某个内存地址中的值
          • 查看当前文件的程序语言
    • 分割窗口
          • 分割窗口,一边查看代码一边测试

参考链接
layout很有用

运行(run/continue/next/step/until/finish/call/quit)

run(简写r): 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入;
continue(简写c):继续执行,到下一个断点处(无断点即执行到结束或崩溃)
next(简写n): 单步跟踪程序,当遇到函数调用时,直接调用,不进入函数
step(简写s):单步调试如果有函数调用,则进入函数,与命令n区分;
until:运行程序直到退出循环体; / until+行号: 运行至某行(退出循环
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。(退出函数
call 函数(参数):调用函数并传递参数,如:call gdb_test(55)
quit:简记为 q ,退出gdb

断点

显示当前程序的断点设置情况
info breakpoints
设置断点(在某个函数入口或指定行号处)
break +函数名/行号
暂停设置的断点(可再次开启)
disable [breakpoints] [num…]
#breakpoints 参数可有可无;num…表示可以有多个参数
#如果指定 num…,disable 命令会禁用指定编号的断点;反之若不设定 num…,则 disable 会禁用当前程序中所有的断点。
enable +num 
#可再次开启某号断点。

eg:

(gdb)dis 1 #表示禁用断点1
清除断点(delete/clear)
delete 断点号n:删除第n个断点
clear 行号n:清除第n行的断点

函数堆栈中进行调试

对于当前状态(可以是发生崩溃后)返回上/下一层调用函数
up 
#返回到达当前步骤的上一步
down
#进入下一个堆栈中的函数
查看当前调用函数堆栈列表
(gdb) backtrace [-full] [n]
(gdb)bt
跳转到堆栈中的某个函数

该命令会依次打印出当前栈帧的如下信息:
1、当前栈帧的编号,以及栈帧的地址;
2、当前栈帧对应函数的存储地址,以及该函数被调用时的代码存储的地址
3、当前函数的调用者,对应的栈帧的地址;
4、编写此栈帧所用的编程语言;
5、函数参数的存储地址以及值;
6、函数中局部变量的存储地址;
7、栈帧中存储的寄存器变量。

frame

eg :

f 2
#跳转到堆栈中 编号为2的函数中

打印信息

ctrl + x + a 快捷键可以浏览当前所在代码上下几行。

set命令传参或修改参数值进行调试

set args作为程序运行时参数

#include 
int main(int argc,char**argv){
        printf("argv[0] is %s\n",argv[0]);
        printf("argv[1] is %s\n",argv[1]);
        printf("argv[2] is %s\n",argv[2]);
}
#调试运行结果
(gdb) set args hello world
(gdb) r
Starting program: /home/huqw/test/a.out hello world
argv[0] is /home/huqw/test/a.out
argv[1] is hello
argv[2] is world

set还可以将变量的值进行修改,可以查看自己期待得到的结果

#include
int main(){
        int a = 5;
        printf("a is %d\n",a);
        printf("a is %d\n",a);
        return 0;
}
Breakpoint 1, main () at set_param.c:4
4		printf("a is %d\n",a);
(gdb) n
a is 5
5		printf("a is %d\n",a);
(gdb) print a
$1 = 5
(gdb) set var a=3
(gdb) print a
$2 = 3
(gdb) n
a is 3
查看某个变量或者表达式的值

print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a

查看某个内存地址中的值
x :查看内存地址中的值
x/[number][format] <addr>
其中number,format和u都是可选参数,addr为查看变量的内存地址

eg :

(gdb) print input
(gdb) x/20 0x400c90
#表示查看0x400c90到向后0x400c90+20的内容
查看当前文件的程序语言
info source
#会显示当前文件名,编译路径

分割窗口

分割窗口,一边查看代码一边测试
layout

你可能感兴趣的:(c/c++开发,linux,运维,bash,gdb,后端)