Nenhuma caixa de diálogo de travamento quando um programa trava no Cygwin no Windows 7

Nenhuma caixa de diálogo de travamento quando um programa trava no Cygwin no Windows 7

Quando, no Windows 7, inicio um programa de console que deveria travar, tenho os seguintes casos:

  • Se euDuplo clicknele, ele trava e um "seu programa travou"pop-up de diálogo abre
  • Se eu lançá-lo através de umconsole DOS, ele trava e um "seu programa travou"pop-up de diálogo abre
  • Se eu lançá-lo através de umConsola Cygwin, ele trava silenciosamente.Nenhum pop-up de diálogo

Observe que no Windows XP tudo funciona conforme o esperado (uma caixa de diálogo é aberta...) e posso depurar o programa travado.

Isso é um bug do cygwin no Windows 7? Um problema de configuração?

Dados diversos

  • Meu Cygwin é 1.7.5, mas foi reproduzido com um Cygwin 1.7.7.
  • Funciona no WinXP, mas falha no Cygwin no Windows 7 (32 ou 64 bits)
  • A caixa de diálogo é interessante para fins de desenvolvimento/depuração

Escrevi o seguinte programa C++ no Visual Studio 2008, em depuração (32 bits ou 64 bits têm o mesmo resultado):

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

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

O ::DebugBreak()foi substituído por int * p = NULL ; *p = 42 ;(que deveria travar com uma exceção de violação de acesso), exatamente com os resultados bugados no Cygwin.

Obrigado !

Responder1

Observei o mesmo problema com versões recentes do Cygwin. Ainda não sei o que está causando isso, mas a função SetErrorMode do Windows parece funcionar muito bem:

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

Apenas uma dica: se você estiver usando MSVC, use a função intrínseca __debugbreak(). Ele coloca a quebra naquele ponto do código, em vez de dentro de uma função chamada a partir daí. Algum assembly embutido pode fazer esse truque em outros compiladores.

informação relacionada