procdump 在异常上创建转储后程序继续执行

Program execution continues after procdump created a dump on an exception

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

当我将带有 -e 的 ProcDump 附加到调试版本时,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 开关,甚至在与多个二进制文件的所有可能组合中与我的问题模糊相关。

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

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

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