gdb - 防止在捕获/重新抛出情况下丢失回溯

时间:2014-05-23 03:44:36

标签: c++ exception exception-handling gdb

是否可以重新抛出异常而不会丢失gdb中的反向跟踪?或者有没有办法在gdb中备份"几条线和后面的痕迹?我是GDB 7.7.1,最新的。

我有时会发现自己遇到这样的情况,需要从异常的原始抛出中追溯,需要注释掉try / catch部分,重新​​编译,并在gdb中重新运行。

try {
   someFuncThatCanThrowException();
} catch(exceptionType& exception) {
   if(@CAN_RECOVER@) {
      ...
   } else {
      throw;
   }
}

---- ---- OR

try {
   someFuncThatCanThrowException();
} catch(exceptionType& exception) {
   exception.printMessageToCout();
   throw;
}

1 个答案:

答案 0 :(得分:6)

  

需要从异常的原始抛出中追溯,

使用打印所有抛出的所有回溯的简单方法是否可以,然后当需要找到特定异常的回溯时,只需通过异常的地址找到它。像这个gdb命令序列的东西:

set pagination off
catch throw
commands
info args
bt
c
end

当您需要查找异常的回溯时,首先打印其地址,如下所示:

print &exception

在gdb输出中找到它的地址。它必须由info args打印。一旦找到地址,info args输出后就会出现此异常的回溯。