gdb - 防止在catch/rethrow情况下丢失回溯信息

5

在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个回答

6
需要从异常的原始抛出位置获取回溯信息,是否可以使用简单的方法打印所有抛出的回溯信息,然后在需要查找特定异常的回溯时,通过异常地址找到它。类似以下GDB命令序列:
set pagination off
catch throw
commands
info args
bt
c
end

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

print &exception

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

这个问题中有关于 "catch throw" 命令的更多讨论,我认为这实际上是正确的方法:https://dev59.com/62kv5IYBdhLWcg3wbgbQ - gkanwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接