GDB 调试C++异常

调试C++异常的两种办法:
1) 直接获取异常的相关调用函数,在相应函数处设置断点。

2) 利用gdb的catch throw/catch。(程序执行后,方有效)


(gdb) bt
#0 0x0000003cf592e2ed in raise () from /lib64/tls/libc.so.6
#1 0x0000003cf592fa3e in abort () from /lib64/tls/libc.so.6
#2 0x0000003cf86b1138 in __gnu_cxx::__verbose_terminate_handler () from /usr/lib64/libstdc++.so.6
#3 0x0000003cf86af166 in __cxa_call_unexpected () from /usr/lib64/libstdc++.so.6
#4 0x0000003cf86af193 in std::terminate () from /usr/lib64/libstdc++.so.6
#5 0x0000003cf86af293 in __cxa_throw () from /usr/lib64/libstdc++.so.6
#6 0x0000000000400e9f in test ()
#7 0x0000000000400f9d in main ()

从上述调用栈,可以得知异常由__cxa_throw ()抛出,可在该函数处设置断点,从而得知“异常出自哪里”。

上述给出的获取异常调用函数信息的方法,应该和操作系统和调试器无关,其他平台类似。

1) 直接获取异常的相关调用函数,在相应函数处设置断点。
利用前一步骤的信息,直接b __cxa_throw,即可设置有效断点。

2) 利用gdb的catch throw/catch
该方法也很通用,但有一个需要注意的地方:在程序执行之前,catch throw/catch是无效的,需要在程序执行之后(先在main处设置断点),使用catch throw才有效。



### 使用 GDB 调试 C++ 程序 为了有效地使用 GDB 调试 C++ 程序,确保编译时加入调试信息至关重要。当编译源代码时,应使用 `-g` 参数来包含调试信息,并建议关闭优化选项以保持程序行为的一致性[^3]。 #### 编译带有调试信息的C++程序 ```cpp g++ -g -O0 -Wall my_program.cpp -o my_program ``` 此命令不仅包含了调试信息(`-g`),还禁用了所有的优化(`-O0`)以及启用了所有警告(`-Wall`),有助于更精确地定位问题所在。 如果尝试加载未带调试信息编译的目标文件至GDB中,将会遇到如下提示:“Reading symbols from ./gdb_test...(no debugging symbols found)...done.” 这表明目标文件缺少必要的调试符号表,无法提供有效的调试支持[^4]。 一旦拥有正确配置过的二进制文件,就可以启动GDB来进行交互式的调试工作: #### 启动GDB并载入待调试的应用程序 ```bash gdb ./my_program ``` 进入GDB环境之后,能够利用一系列内置指令完成具体的调试操作。以下是几个常用的功能描述及其对应的快捷方式: - **单步执行不进入函数内部** 执行 `next` 或者其缩写形式 `n` 可让程序逐行运行而不深入任何被调用的方法体内。 - **单步执行且进入函数内部** 输入 `step` 或简写的 `s` 则会在遇到子过程调用的时候自动跳转到该方法的第一行处暂停等待进一步指示。 - **恢复程序正常运行直至下一个断点** 发送 `continue` 命令(也可写作 `c`),可以让应用程序按照预期流程继续前进直到碰到新的中断位置或是到达终点为止。 - **显示指定表达式的当前值** 通过键入 `print <expression>` (或简称 `p <expression>`)可以查询特定变量或其他计算结果的状态。 - **查看完整的调用链路详情** 当前时刻整个系统的调用层次结构可以通过发出 `backtrace` (即 `bt`) 来获取全面视图,这对于理解异常发生的位置非常有帮助。 最后,若想终止本次会话则只需简单输入 `quit` 或者按组合键 Ctrl-D 即可安全退出工具[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值