-1

我抛出了一个throw std::exception("dummy")没有在任何地方被捕获的异常(作为测试)。
如果没有附加 ProcDump,这会立即使进程崩溃。

当我将 ProcDump 附加-e到调试版本时,ProcDump 正确检测到未处理的异常,创建故障转储并退出。但是程序继续执行,就好像从未抛出异常一样。

我可以在 ProcDump 退出后手动使进程崩溃,但我真的不喜欢代码在崩溃后继续运行的想法,这种崩溃应该是致命的,即使它只是几毫秒。

这是什么原因造成的?如何确保我的程序崩溃(并且崩溃转储正确地代表了崩溃点)?这是 ProcDump 的问题还是我如何使用它?

这是重现此问题的最小示例:

#include <iostream>

int main() {
    char c;
    std::cin >> c;
    if (c == 'e')
        throw std::exception("dummy");
    std::cout << "clean exit" << std::endl;
    return 0;
}

我已经用 m$ clang-cl 和 msvc 试过了。我已经尝试了每一个 ProcDump 开关,甚至在与多个二进制文件的所有可能组合中都与我的问题模糊相关。

4

1 回答 1

1

不幸的是,我没有一个好的答案。看起来procdump中有一个错误。您可以在Sysinternals 论坛上报告它或联系 Mark Russinovich (@markrussinovich) 或 Andrew Richards (@arichardmsft)。我可以确认当您附加到该过程时会发生这种情况,例如,procdump -e prog. 当您在 procdump ( procdump.exe -e -x . prog.exe) 下运行应用程序时,它会按预期运行。Procdump 作为附加到进程的调试器运行,因此它可能会“吞下”异常。当然,它不应该,但 API 允许它这样做。

作为替代方案,在 procdump 得到修复之前,您可以考虑使用minidumper(我过去曾为它做出过贡献)。它没有 procdump 那么多的命令行选项,但 -e 选项可以按预期工作,例如MiniDumper.exe -ma -e2 12824.

在内部,minidumper 的设计与 procdump 非常相似,并且还实现了一个调试器引擎。这是处理异常事件的行: https ://github.com/goldshtn/minidumper/blob/master/MiniDumper/Debugger.cs#L106 。

于 2021-08-16T19:47:53.780 回答