是否可以启用在 Cygwin 终端中运行的非 Cygwin 应用程序的事后调试?

标签 c windows visual-c++ cygwin windbg

我们有一个混合了 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/

相关文章:

c - 当涉及多个算子时,执行顺序如何确定?

python - 需要帮助来使用 pyinstaller 编译 python

c++ - 如何在 msvc 2010 上运行 C 项目

windows - 如果共享内存的进程之一被终止,共享内存会发生什么?

windows - 如何在 Windows 上读取 Perl 中的管道输入?

c++ - 用于维护 API 向后二进制兼容性的 GCC 与 MS C++ 编译器

c++ - 如何在 C++ 中为不同的温度单位制作不同的构造函数?

c - 如何确保已读取微 Controller 外围寄存器

c - 如何使用 C 在 Linux 上的线程中修复 "Error reading from socket - bad file descriptor"?

c - 来自 proc_fs.h 的 proc_create_entry 错误 "implicit declaration"