gdb学习

Posted by jabin on April 5, 2016

GDB概述

一般指Linux环境下,对C/C++为主的计算机程序的调试工具

常用命令及简写

  • run(r)–运行程序–r args
  • break(b)–设置断点–b 1
  • print(p)–打印变量–p var
  • next(n)–单步执行
  • continue(c)–继续走你
  • jump(j)–跳行至–j 1
  • list(l)–查看源码–list 5 (查看第5行前后若干行的代码)

调试正在运行的程序

在编译的时候需要加上-g参数。 gdb <prog>关联上源代码。 然后,用ps命令查到要调试程序的pid,再用attach,挂接到对应的pid。 相对地,detach可以取消挂接。

暂停/恢复程序运行

五种方式:BreakPoint,WatchPoint,CatchPoint,Signals,线程停止。 前四种用得较多。

断点

除了一般地在某行暂停程序,还可以加condition参数,即b if <condition>

观察点

常当观察的变量变化时,暂停程序。 watch you, if you changed, stop!

捕捉点

catch <event>监控事件,如载入库,fork进程等

信号

handle <signal> <keywords>这里,我们可能需要了解诸如SIGINT(中断信号)这样的系统信号,以及对信号的处理代号keywords(stop,pass,etc.)

其他有意思的点

有时我们可能希望在某些情况下,断点是无效的,这时我们可以用condition <bnum> <exp>

查看源程序

  • l foo–查看函数名为foo的源代码
  • l -–查看当前行(暂停)的前后若干行代码
  • reverse-search <string>–全文搜索
  • info line 50–查看50行的内存地址,可通过help info查询更多相关命令

查看运行时的数据

  • display <exp>–暂停程序时,自动显示跟踪的变量。
  • 每一个print命令都会把print的变量,重新额外赋一个编号,按顺序$1,$2…好处呢,不用输又长又臭的变量名啦。
  • set var=**–有时,我们需要记录调试过程中的一些有用变量,这时可通过设置GDB的环境变量来解决

改变程序的执行

修改程序的变量值

print x=4–将程序变量x修改为4

程序跳转

jump <lines>–跳到文件的某行