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函数,获取当前进程调⽤堆栈的相关信息,进⽽输出到⽇志中帮助

定位问题。具体的实施⽅案可以参考这个链接:

如果第三⽅库,那⽬前能想到的还是使⽤⽅案⼀。⽅案⼆的问题在于,⽆法对第三⽅库的抛异常时,把⾃⼰的代码挂进去执⾏。