2023年11月29日发(作者:)
C++抛异常时如何获取异常时的堆栈调⽤信息
问题背景
⼀般来说,我们使⽤第三⽅代码的时候,不可避免的会遇到异常信息。例如调⽤错误,库中会抛出异常。经常是由于上下⽂⽇志不⾜,我们
只能看到catch处的⽇志,⽽不清楚异常是哪些函数调⽤导致。这导致定位问题⽐较⿇烦,经常要花⽐较长时间去跟进。去⽹上找了些资
料,
解决⽅案
⽅案⼀:感觉最简单的,还是借助GDB⼯具,⽤catch throw命令来帮忙找问题所在。具体的实施⽅案可以参考这个链接:
我把原⽂coyp过来,如下:
Here's an example throw_.
#include
#include
using namespace std;
~/exception$ make
g++ -g throw_ -o throw_exception
~/exception$ gdb throw_exception
...
Reading symbols from done.
(gdb) catch throw
Catchpoint 1 (throw)
(gdb) run
Starting program: throw_exception
Catchpoint 1 (exception thrown), 0x00007ffff7b8f910 in __cxa_throw () from /usr/lib/libstdc++.so.6
(gdb) where
#0 0x00007ffff7b8f910 in __cxa_throw () from /usr/lib/libstdc++.so.6
#1 0x0d89 in function () at throw_:8
#2 0x0dca in main () at throw_:15
(gdb)
⽅案⼆:如果是⾃⼰写的代码,在抛出异常的时候,可以借助backtrace函数,获取当前进程调⽤堆栈的相关信息,进⽽输出到⽇志中帮助
定位问题。具体的实施⽅案可以参考这个链接:
如果第三⽅库,那⽬前能想到的还是使⽤⽅案⼀。⽅案⼆的问题在于,⽆法对第三⽅库的抛异常时,把⾃⼰的代码挂进去执⾏。


发布评论