gdb调试一:
首先进入gdb,确定好进程,输入进程号
确定要调试哪个文件,然后输入:(b为打断点)
(gdb) b serialization_protobuffer.h:write<ros::serialization::OStream>(ros::serialization::OStream&,
然后按下tab键,可以补齐出现的可能性
知识点一:
编译器会根据传入的参数,会序列化一个实例的代码(比如具体化模版里的参数类型)
那么选择想要调试的代码
此时进程停止在断点处,在gdb终端输入c,继续进程
在gdb终端输入bt可以看此时的函数栈
以下是文心一言的解释:
在
gdb
(GNU调试器)中,bt
是backtrace
的缩写,用于显示当前线程的调用栈(call stack)的跟踪信息。调用栈是一个数据结构,它保存了函数调用的信息,包括调用序列、函数参数和局部变量等。当程序崩溃或出现错误时,调用栈是非常有用的调试工具,因为它可以帮助开发者理解在发生问题时,哪些函数被调用以及它们是如何被调用的。使用
bt
(或backtrace
)命令时,gdb
会从当前函数开始,向上回溯调用栈,并显示每个函数的名称、地址以及源代码中的位置(如果可用)。这样,开发者就可以从调用栈中看到函数调用的完整路径,从而找到可能导致问题的代码位置。例如,如果你在
gdb
中遇到了一个段错误(segmentation fault),并希望查看在发生错误时的调用栈,你可以使用bt
命令。这将显示从出错位置开始的所有函数调用,直到程序的入口点。
gdb终端输入f 0进入第一层代码
同理f 1进入第二层代码。
输入info args查看参数的详细信息:
输入list查看代码:
输入s
gdb
中的s
指令是用于单步执行程序的,它可以进入函数内部进行逐行调试。在GDB中,
s
命令让调试者能够控制程序一行一行地执行,特别是在函数调用时,能够进入函数内部查看详细的执行情况。这种控制对于理解程序逻辑,定位错误代码,以及观察变量在不同执行阶段的变化情况是非常有帮助的。使用该命令时,如果当前行代码中有函数调用,GDB会进入到该函数内部,再次使用s
命令,就会继续向下执行该函数内的下一条语句。
输入n:
然后打印pb_str
继续n下一条,然后s进入这个函数(指next这个函数)。
gdb中的s指令用于单步执行程序,如果遇到函数调用,会进入该函数内部进行调试。
在gdb中,s指令全称是step,它相当于其他一些调试器中的“Step Into”,其主要作用是单步执行源代码。当使用s指令时,如果当前代码行包含函数调用,调试器会进入该函数,并停在函数的第一个语句上。这与其他一些调试操作如next(n指令)形成对比,后者在遇到函数调用时不会进入函数内部,而是将整个函数调用视为一个语句并执行完毕。
查看代码:
在gdb中,`list`命令用于显示源代码。它展示了程序中的一段代码,通常用在断点、单步调试或者当程序崩溃时查看周围的代码。
使用`list`命令时,你可以查看到当前执行停止位置的上下文代码。默认情况下,`list`命令会显示当前源代码文件的10行代码,包括调用过程(函数)中的代码或者即将执行的代码[^2^]。这有助于开发者理解程序的执行流程和上下文。
`list`命令还可以接受参数,让你指定显示哪些行代码,例如:
- `list`:列出当前执行点的源代码。第一次使用时,列出主函数。
- `list function`:显示名为function的函数的源代码。
- `list line_number`:显示从line_number开始的源代码。这个命令对于理解和分析代码尤其重要,因为它能够帮助开发者快速定位和检视源代码中的特定部分,特别是在进行调试、代码审查或了解新项目代码结构时。
可以通过print指令打印出变量的中间值,检查自己判断的是否正确。
gdb调试一定要在cmake文件中注释如下代码:
否则无法正常调试