新手入门之GDB调试

时间:2022-05-02 20:11:37

写这篇文章算是对最近两天工作的一个经验总结吧。

要让可执行文件比较方便地在DGB上调试,在用gcc编译的时候要使用-g选项。

如何使用GDB启动被调试程序?

"gdb path_to_debugee”,其实这还不是真正的启动,要启动调试程序,还需要在命令行里敲"r"。如果debugee在启动时还要有相应的输入参数,比方说:debugee –p1,那么在前面提到的r命令后面,附带上-p1就可以了,完整的样子看上去是这样的:"r –p1"。

设置断点

通过gdb path_to_debugee启动调试后,就可以设置断点了。设置断点的命令很直观,break。我们可以:

  • 在函数的入口设置断点,比方说“break main”。也可以通过类名来限定目标函数。比方说“break classA::func”。
  • 根据行号设置断点:break line_number。这条命令默认的行在当前运行的编译单元对应的原文件中。如果要指定某个文件中的某行,请使用:break file.cpp:line_number。
  • 条件断点:条件断点的设置和前面提到的类似,就是要加一个判断条件:if condition。类似于“break func/line if some_variable > or < num”的形式。

单步调试

单步有两种形式:

  • 单步执行并跳过这一行(VS F10功能):n
  • 单步执行并进入(VS F11功能):s

打印变量

这个比较简单,命令行:p var_name

打印堆栈

命令行:backtrace,简写bt

打印源代码

命令行:l。这个命令接受参数。比方说要打印从第几行到第几行,可以这么做:l 1,18。这会打印当前执行文件第1行到18行的代码。要打印某个函数,可以是:l function_name。要打印某个成员函数:l classname::memfunc。

结束调试程序

kill

结束语

附上一些资源,供向我这样的初学者参考: