2010-01-27 2 views
3

Comment puis-je empêcher l'apparition de la fenêtre contextuelle de débogage lorsqu'une assertion échoue sur une machine Windows? L'application que j'écris est basée sur la console et j'utilise assert() pour tester certaines choses quand elle est exécutée en mode test. J'utilise MinGW + GCC 4.Windows: empêcher les échecs assert() d'ouvrir la fenêtre de débogage

Modifier: Ceci est le programme de test.

#include <stdlib.h> 
#include <assert.h> 

int main(void) { 
    _set_error_mode(_OUT_TO_STDERR); 
    assert(0 == 1); 
    return EXIT_SUCCESS; 
} 

Drapeaux: gcc -mwindows -pedantic -Wall -Wextra -c -g -Werror -MMD -MP -MF ...

sans Essayé -mwindows aussi bien. Je reçois toujours le popup de débogage, peu importe quoi. C'est sur une machine Vista x86.

+0

'assert()' doit imprimer à stderr par défaut; la fenêtre popup n'apparaît que lorsque vous compilez avec le drapeau '-mwindows' présent ... – Christoph

+0

Je ne compile pas avec un tel drapeau. – Ree

Répondre

3

Il y a plusieurs façons de le faire. Le plus grossier est de redéfinir la macro assert (voir l'en-tête mingw assert.h). Vous pouvez aussi appeler (ce qui est ce que je vous conseille):

_set_error_mode (_OUT_TO_STDERR); 

Edit: Vraiment, ça marche pour moi:

#include <stdlib.h> 
#include <assert.h> 

int main (void) 
{ 
    _set_error_mode (_OUT_TO_STDERR); 
    assert (0 == 1); 
    return 0; 
} 

Compile avec gcc -mwindows, il ne montre pas la boîte de dialogue lors de l'exécution. Supprimer la ligne avec _set_error_mode et il affiche la boîte de dialogue. Si cela ne fonctionne pas pour vous, donnez un exemple complet.

+0

Vous ne voulez pas dire '_OUT_TO_STDERR'? – MSalters

+0

Oui, je l'ai fait. Corrigé, merci. –

+0

Ceci est étrange. Quand j'appelle la fonction dans 'main()', j'obtiens une déclaration de fonction implicite et des erreurs de macro non définies. Mais j'ai stdlib.h inclus et j'ai vérifié les déclarations moi-même - ils sont là. La macro est définie comme '# define _OUT_TO_STDERR 1' et la fonction comme _CRTIMP int __cdecl __MINGW_NOTHROW _set_error_mode (int);'. Une idée de pourquoi je reçois les erreurs? – Ree

2

Voici ce que je l'utilise, et qui semble fonctionner:

SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 
+1

C'était la solution qui a réellement fonctionné pour moi. Il convient d'ajouter que 'inclure ' doit être ajouté (fonctionne avec MingW). Pour moi aussi le 'SEM_NOGPFAULTERRORBOX' était suffisant pour définir avec SetErrorMode'. –

+0

A travaillé pour moi aussi. – vitaut

Questions connexes