我有使用反引号启动任意进程的脚本。 偶尔会发生崩溃(例如零除),并且需要获取核心转储进行分析。
我已经向操作系统注册了一个perl脚本作为崩溃处理程序(在Windows 7中 - 我知道你想知道),它被崩溃的PID调用;处理程序附加Microsoft的"cdb"调试器,创建所需的转储。 我的测试"崩溃器"程序是一个C++可执行文件,它执行除以零(Crasher.exe)。
问题:当我使用Cygwin的Perl实现时,程序崩溃永远不会触发崩溃处理程序。 我怀疑 Perl 发现了问题并默默地放弃了它。 使用来自ActiveState的Perl都可以正常工作。
问题:我怎样才能让Cygwin的Perl摆脱困境,让错误一直传播回系统。
下面是一个使用 ActiveState perl 的示例,该 perl 触发崩溃处理程序并生成核心转储
C:> toolsPerlbinperl.exe -e "`Crasher.exe`;"
但是使用Cygwin并不能
C:> cygwinbinperl.exe -e "`Crasher.exe`;"
另外,如果我直接在 Cygwin 的 shell 中启动 Crasher.exe则不会调用崩溃处理程序;如果在 Cygwin 或 ActiveState Perl 中通过反引号启动,也不会调用它。
让我引用Hans Passant的话:
基本问题是SAP调用SetUnhandledExceptionFilter()。并做自己的事情,所有大型程序都这样做。操作系统中没有内置的老板覆盖开关来阻止它执行此操作。
所以不,你也不能为Cygwin做这件事。可以在调试器下运行它并捕获第一次机会异常。根据引发的异常数量,您可能会找到有趣的异常。