題 程序在Windows 7上的Cygwin崩潰時沒有崩潰對話框


在Windows 7上,當我啟動應該崩潰的控制台程序時,我有以下情況:

  • 如果我 雙擊 在它上面,它崩潰並且“你的程序崩潰了” 對話框彈出窗口打開
  • 如果我通過一個啟動它 DOS控制台,它崩潰了,“你的程序崩潰了” 對話框彈出窗口打開
  • 如果我通過一個啟動它 Cygwin控制台,它默默地崩潰了。 沒有對話框彈出窗口

請注意,在Windows XP上,一切都按預期工作(對話框彈出窗口打開...),我可以調試崩潰的程序。

這是Windows 7上的cygwin錯誤嗎?配置問題?

雜項數據

  • 我的Cygwin是1.7.5,但它是用Cygwin 1.7.7複製的。
  • 它適用於WinXP,但在Windows 7(32或64位)上的Cygwin失敗
  • 對於開發/調試目的,該對話框很有趣

我在Visual Studio 2008上編寫了以下C ++程序,在調試中(32位或64位具有相同的結果):

#include <cstdio>
#include <windows.h>

int main()
{
   printf("It should crash now...") ;
   ::DebugBreak() ;
   return 0 ;
}

::DebugBreak()已被取代 int * p = NULL ; *p = 42 ; (它應該與訪問衝突異常一起崩潰),與Cygwin上的錯誤結果完全相同。

謝謝 !


3
2017-10-08 13:57


起源




答案:


我觀察到最近版本的Cygwin存在同樣的問題。我還不知道是什麼導致它,但Windows SetErrorMode函數似乎有效:

{
  const UINT oldErrorMode = ::SetErrorMode(0);
  ::DebugBreak();
  ::SetErrorMode(oldErrorMode);
}

只是提示:如果您使用的是MSVC,請改用__debugbreak()內在函數。它將斷點放在代碼中的那一點,而不是在那裡調用的函數內。一些內聯彙編可能會在其他編譯器上執行此操作。


4
2017-11-30 10:16



為了跟進這一點,根據Windows文檔,子進程繼承其父進程的錯誤模式。顯然,Cygwin正在設置其錯誤模式以抑制崩潰對話​​框,這會影響從cygwin shell運行的所有進程。 - Daryl