GDB命令

一. gdb编译选项(gcc/g++ 在编译时加入-g来加入debug信息)

  1. -g0等于不加-g,即不包含任何调试信息
  2. -g1包含最小的调试信息,一般来说只有在你不需要调试信息,之需要backtrack信息,并且很在意程序大小,或者有其他保密/特殊需求是才会使用-g1
  3. -g2为gdb默认,包含绝大多数你需要的调试信息
  4. -g3包含额外的调试信息,例如包含宏定义信息

二. gdb常见用法

  1. 调试程序
    1.gdb ${application} 进入gdb后,输入run(简写r) ${arg1} ${arg2}...${argN}
    2.gdb --args ${application} ${arg1}${arg2}...${argN},进入gdb后运行run
    3.gdb进入gdb,输入file ${application}。然后使用set args ${arg1}${arg2}...${argN}设定好程序的参数然后再run
  2. 调试正在运行的程序
    gdb ${application} ${pid}
  3. 调试core文件
    gdb ${application} ${core文件}
    三. 常用命令
  4. backtrack:显示栈信息,简写为bt
  5. frame x: 切换到第x帧。其中x会在bt命令中显示,从0开始,0表示栈顶,简写为f
  6. up/down x往栈顶/栈底移动x帧,当省略x时默认为1
    4 print x打印x信息,x可以是变量、对象或者数组,简写为p
  7. print */&x打印出x的内容或者地址
  8. call调用函数,注意该命令需要一个正在运行的程序
  9. set substitute-path from_path to_path替换源代码文件。当编译机与运行机代码路径不同是需要用该命令替换代码路径,否则你无法看到源代码
  10. break x.cpp:n在x.cpp第n行设置断点,然后gdb会给出断点编号m。命令看简写为b后面会有break命令的详细解释
  11. command m设置程序执行到断点m处要查看的内容如:
    command n
    >printf "x is %d \n", x
    >c
    >end
    //如果command命令后面没有n则默认为最后一 个breakpoint
  12. x /nfu ${addr}打印addr的内容。addr可以是任何合法的地址表达式,如0x562fb3d、一个有效的指针p或者有效的变量地址(&var),/nfu是格式n表示要查看的长度,f表示格式(例如16进制/10进制),u表示单位(例如单字节b,双字h,四字w)一个例子:
    (gdb) x /3xw 0x562fb3d //即以16进制显示地址0x562fb3d处的3个单位,每个单位4字节内容
  13. continue继续运行程序,可简写为c
  14. until直到当前循环完成,可简写为u
  15. step单步调试,步入当前函数,可简写为s
  16. next单步调试,布过当前函数,可简写为n
  17. finish执行到当前函数返回,步出当前函数
  18. set var x=2改变变量x的值,也可以这样使用:set {int}0x32075598 = 2把内存0x32075598的内容解释为int并修改其内容为2
  19. info locals打印当前栈帧的本地变量
  20. jump使当前执行程序调整到某一行,或者跳转到某个地址。由于只会使程序跳转而不会改变栈值,因此若跳出函数到另外的地方 会导致return出错。另外,熟悉汇编的人都知道,程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump命令也就是改变了这个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。如: set $pc = 0x485
  21. return强制函数返回可以指定返回值

四. 程序中断机制:监视点(watchpoint)和捕捉点(catchpoint)

  1. 监视点:监视内存某个地址,一旦该地址的内容被改变,程序就进入调试器。监视点又分为软件模式和硬件模式:软件监视是gdb单步执行程序的同时测试变量的值,所以速度会变慢。同时软件监视只在当前线程有效,幸运的是32位intelx86提供了4个特殊的调试寄存器用来方便调试程序,gdb可以使用这些寄存器建立硬件监视然而,可用的(enable的)硬件监视点的个数是有限的。如果你设置了过多的硬件监视点,当程序从中断的状态变为执行的状态(例如continue,until或者finish)时,GDB 可能无法把它们全部激活。另外,活动的硬件监视点的数量只有在试图继续执行程序时才能知道,也就是说,即使你设置了过多的硬件监视点,gdb在你运行程序之前也不会警告你。设置监视点的命令有3个:watch(写监视)、rwatch(读监视)以及awatch(读写监视),他们的使用方法一样都为以下几种:
    1.(r/a)watch x:x为变量,当x的值改变/被读取时,程序进入调试器
    2.(r/a)watch 0xN:N为有效地址
    3.(r/a)watch (int)0xN:N为有效地址当该地址int型指针指向的内容改变时进入调试器
    4.(r/a)watch -l (int)0xN:较上一个,该地址本身变化也会进入调试器
  2. 断点,断点break有一些变体:tbreak、hbreak、thbreak与rbreak。tbreak和break功能相同,只是所设置的断点在触发一次后自动删除,hbreak是一个硬件断点,thbreak是一个临时硬件断点。注意硬件断点需要硬件支持,某些硬件可能不支持这类断点。rbreak稍稍特殊些,它会在匹配正则表达式的全部位置加上断点,该断点后面还有详述。非rbreak断点的用法:
    1.(t/h)break x.cpp:y:在文件x.cpp第y行加断点,x.cpp若不指定则在当前文件第y行加断点,若程序未执行则以包含main函数的文件设置断点,若x.cpp和y都不指定则以当前debuger的点作为断点
    2.(t/h)break 0xN:在地址0xN处加断点,N为有效的代码段地址
    3.(t/h)break x.cpp:func:在x.cpp的函数func入口处加断点
    4.(t/h)break +/-N:在当前运行处第N行后/前加断点
    5.rbreak REGEXP:在所有符合正则表达式的函数入口处加断点,如:rbreak EX_*表示所有符合以EX_开头的函数入口处加断点。注意break后面还有两个可选参数:线程id和条件,线程id指在info threads中的线程序号,而非系统提供的tid,例如break x.cpp:y 2 if(a == 24)表示在2号线程的x.cpp文件第y行加入断点并且只有当a==24,程序才会触发断点另外,breakpoint可以通过save命令保存,方便下次再次进入程序调试时不再需要需要重新设置断点
  3. 捕捉点是当某些事件发生时,程序进入调试状态,如catch一个exception、assert、signal,fork甚至syscall。tcatch和catch功能一样,区别是tcatch是临时的,catch一次后就会自动删除

五. 跟踪点(tracepoint)
跟踪点与上面介绍的不同之处在于,他只是跟踪记录信息而不会中断程序的运行。tracepoint可以通过save保存,方便下次继续使用。

六. 检查点
gdb可以保存程序某个时间点的程序状态或者程序映像,并且稍后又可以返回到这个状态,这称为checkpoint。每个检查点是进程的一份拷贝,这样当一个bug很难重现,而又担心调试过了头时又要重头开始,这时候可以设置checkpoint,这样即使调试过头了,也可以直接从该checkpoint开始,而不用重新重启整个程序(也许需要很久!!!)。但是每个checkpoint有自己的唯一进程id,这个pid与原程序的pid是不同的,因此程序需要使用pid信息时需要慎重考虑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容