gdb及其使用

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文件中注释如下代码:

否则无法正常调试

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值