我们有一个混合了 Cygwin 和非 Cygwin 程序的系统,所有这些程序都在 Cygwin bash session 下运行。
其中一个非 Cygwin 可执行文件定期崩溃,我正在尝试使用 windbg as outlined here 启用事后调试.
我写了一个故意崩溃的测试程序。按照上面页面中的步骤进行操作后,当测试程序崩溃时,windbg 会自动打开——这正是我要找的。但是,如果我从 Cygwin 的 bash 运行测试程序,bash 会打印一条“Segmentation fault”错误消息并且 windbg 不会打开。
有没有办法让 windbg 打开非 Cygwin 程序,该程序是从 Cygwin bash shell 启动的,崩溃了?
P.S.:我们所有的非 Cygwin 程序都是使用 MS Visual Studio 编译的 C 程序。
最佳答案
Cygwin 可能正在安装一个未处理的异常过滤器,允许它处理崩溃并因此打印“Segmentation fault”。这会阻止即时调试器启动,因为异常确实已由 Cygwin 处理。我不知道你是否可以禁用它。要获取内存转储,您可以使用 procdump 为所有 first chance 异常创建内存转储。最终的第一次机会异常内存转储很可能对应于导致 Cygwin 显示“段错误”的内存转储。
运行您的程序,然后从 Windows 命令提示符运行:
procdump -e1 <PID|Process Name>
如果您的程序在您有机会运行 procdump 之前崩溃,请尝试先使用 -w
运行 procdump选项,以便它将等待您的程序启动。然后运行你的程序。
确保用“e”指定“1”,否则您将无法获得第一次机会异常(exception)。
您可以从 Microsoft 获取 procdump,网址为: https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
关于是否可以启用在 Cygwin 终端中运行的非 Cygwin 应用程序的事后调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31123528/