gdb调试常见命令详细总结
创始人
2024-04-09 14:25:57
0

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] 
其中number,format和u都是可选参数,addr为查看变量的内存地址

eg :

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

分割窗口

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...