【问题标题】:Get line of last executed return statement获取最后执行的 return 语句的行
【发布时间】:2020-04-11 18:46:25
【问题描述】:

是否有可能在任何 C/C++ 调试器中查看最后一个 return 语句发生的位置?甚至是“返回堆栈”,例如调用堆栈,但反过来呢?

bool foo(int bar)
{
    if(bar == 1) return false;
    if(bar == 2) return false;
    return true;
}

void baz()
{
    bool result = foo(4);
}

所以在 baz 中调用 foo 之后,你可以看到 foo 中的三个 return 语句中的哪一个被命中了。

【问题讨论】:

  • 如果您将if 语句和return 语句拆分为单独的行,在调试器中逐行运行时您可以很容易地看到它。或者,如果您的真正问题像这个一样简单,您可以在函数中检查 bar 的值。
  • 如果你将返回语句放在不同的行上,你可以在这些行上设置断点。
  • 是的,我现在就是这样做的。但是,如果您不必编辑代码并在每个 return 语句上放置断点,那将会很方便。我经常在一个循环中多次调用同一个函数,我不想单步执行所有这些。
  • 题外话,因为您使用的是 Visual Studio,但是有反向调试器,可以让您及时退回,然后显示哪个返回语句被击中。 windows下可以看WinGDB时间旅行调试,linux下可以看github上的rr,undo.io(商业)或者gdb,它有小的反向功能。
  • 禁用所有优化set breakpoint on assembler

标签: c++ c visual-studio debugging


【解决方案1】:

这里有一些 C/C++ 的反向调试器,可以在您的调试会话中及时退回:

仅限 Linux:
rr from mozilla
开源,速度真快,小记录痕迹,不得不记录整个应用

undo reverse debugger
商用,没有rr那么快,记录痕迹小,应用记录可以在任何地方开始

GDB reverse debugging
来自 GNU 的标准 gdb,可以记录小功能(有限),开始调试,设置断点,然后开始记录直到下一个断点,您可以在这些点之间反向调试

未经我测试:
RogueWave TotalView Debugger
商用,自带完整的IDE

Windows 10(不支持 7)
WinGDB Reverse Debugging
未经测试,不能说太多。它似乎是唯一使用 Windows 的工具

添加什么,多线程可以由这些调试器处理,但前提是线程的执行序列化到一个核心(伪并行化)。您不能反向调试多核多线程应用程序。原因很简单,反向执行要同步执行的线程,如果“同时”执行两个或多个线程是做不到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多