windows - 当 Cygwin 的 Perl 启动带有反引号的程序时,无法触发系统调试器转储核心

标签 windows perl debugging cygwin windbg

我有使用反引号启动任意进程的脚本。偶尔会发生崩溃(例如,零除法),并且在发生这种情况时需要获取核心转储以进行分析。

我已经在操作系统中注册了一个 perl 脚本作为崩溃处理程序(这在 Windows 7 中——我知道你想知道),它会使用崩溃的 PID 进行调用;处理程序附加了 Microsoft 的“cdb”调试器,它创建了所需的转储。我的测试“crasher”程序是一个 C++ 可执行文件,它执行除零 (Crasher.exe)。

问题:当我使用 Cygwin 的 Perl 实现时,程序崩溃永远不会触发崩溃处理程序。我怀疑 Perl 正在捕捉问题并默默地放弃它。使用来自 ActiveState 的 Perl 一切正常。

问题:我怎样才能让 Cygwin 的 Perl 避开并让错误一直传播回系统。

这是一个使用 ActiveState perl 触发崩溃处理程序并生成核心转储的示例

  C:>     \tools\Perl\bin\perl.exe  -e "`Crasher.exe`;"

但使用 Cygwin 不会

  C:>     \cygwin\bin\perl.exe  -e "`Crasher.exe`;"

此外,如果我直接在 Cygwin 的 shell 中启动 Crasher.exe,则不会调用崩溃处理程序;如果在 Cygwin 或 ActiveState Perl 中通过反引号启动,它也不会被调用。

最佳答案

让我引用 Hans Passant :

The basic problem is that SAP calls SetUnhandledExceptionFilter(). And does its own thing, all large programs do this. There is no boss override switch built into the operating system to stop it from doing this.

所以不,您也不能为 Cygwin 这样做。您可以在调试器下运行它并捕获第一次机会异常。根据抛出的异常数量,您可能会找到有趣的异常。

关于windows - 当 Cygwin 的 Perl 启动带有反引号的程序时,无法触发系统调试器转储核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802100/

相关文章:

perl - 如何在 Perl 中获取目录(文件路径)分隔符?

python - python 有它的错误报告消息吗 $!在 perl 中

debugging - 您必须修复的最混淆的代码是什么?

visual-studio - Visual Studio 2015 远程调试器调试器成员或监视表达式均不返回值

windows - 批处理文件设置双引号变量

c++ - Visual Studio 仅在一个线程中进行调试

windows - 为 Windows 开发内核补丁或驱动程序?

c# - 如何找到已安装软件的执行路径

perl 脚本,只会打印 tomcat 版本

c - 如果该数据仅在 C 函数返回时可用,如何使用 LLDB 自动捕获输出数据?