最近研究了下 GDB,这是一款调试工具中的神器,其实很久以前就有涉及过这款软件,但是由于交互不直观,太多的命令,操作较为复杂等原因,因此我一直以来都很少使用这个工具,实在没办法的时候往往也都是采用插入输出来排查错误。

百度百科的介绍如下:UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

前期操作

  • 使用命令:gcc -g -o test test.c 生成可运行程序,注意:在编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试。
  • 使用 gdb test 正式进入调试过程。

基本命令

进入调试过程后,才能够开始用 gdb 这个工具对程序的运行状态进行控制和观察。具体操作步骤如下:

  • run(或r): 从头开始连续运行程序,和不适用 GDB 直接执行程序效果一致。
  • start : 开始执行程序,停在main函数第一行语句前面等待命令。
  • backtrace(或bt): 查看各级函数调用及参数。
  • frame(或f): 帧编号 选择栈帧。
  • finish 连续运行到当前函数返回为止,然后停下来等待命令。
  • list(或l): 列出源代码,接着上次的位置往下列,每次列10行;list+行号 : 列出从第几行开始的源代码;list+函数名 列出某个函数的源代码。
  • next(或n): 执行下一行语句,和 step 的区别在于,不进入子函数。
  • step(或s): 执行下一行语句,如果有函数调用则进入到函数中。
  • break(或b): 行号 在某一行设置断点;break 函数名 在某个函数开头设置断点;break x if y 设置条件断点,注意 break 加入条件语句往往比较常用,能够更加准确的调到循环语句的第 n 步。
  • delete breakpoints : 断点号 删除断点。
  • disable breakpoints 断点号 禁用断点。
  • continue(或c): 从当前位置开始连续运行程序,被 break 后一般可以使用该语句。
  • set var : 修改变量的值,可以在任何地方使用改制重新修改某一个变量值,更加方便监测和判断。
  • print(或p): 打印表达式的值,通过表达式可以修改变量的值或者调用函数。
  • display+变量名 : 跟踪查看某个变量,每次停下来都显示它的值。
  • undisplay 跟踪显示号 取消跟踪显示。
  • info(或i)+locals : 查看当前栈帧局部变量的值,使用该命令前,先用 backtrace 命令(简写为bt)查看函数调用的栈帧,再用 frame(或f)选择栈帧;info(或i) breakpoints 查看当前设置了哪些断点。
  • watch : 设置观察点,可以具体的查看数组的某个值,如:watch input[5]。
  • info(或i)watchpoints : 查看当前设置了哪些观察点。
  • x : 从某个位置开始打印存储单元的内容,全部当成字节来看,而不区分哪个字节属于哪个变量。可以查看越界的一些信息,如定义 tmp 数组长度为 5,通过 watch 可以查看 tmp[5] tmp[6] 等的数据。
  • quit(或q): 退出gdb调试环境。

其他技巧

由于真正开始研究接触 GDB 时间不长,原本是想这个 IDE 来监控的,可惜找不到体积小巧,功能强大的,所以还是决定研究下 GDB,这边仅能够基本操作 GDB,后续有什么新的发现,会继续补充。


To be continued…

写作时间:21:50-22:28