
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.