2010-11-01 43 views
2

Je suis nouveau dans la programmation C++. Je compile une application Windows qui compile ok avec juste quelques avertissements, mais quand je le lance, il ne semble même pas commencer et retourne une violation d'accès 3 secondes dans la course. Quand j'essaye de déboguer cela ne semble même pas entrer dans le code, donc je ne sais pas par où commencer à chercher le problème.Comment puis-je rechercher la source d'une violation d'accès survenant lors du lancement de l'application?

Voici les informations que j'ai pu récupérer du débogueur:

Building to ensure sources are up-to-date 
Build succeeded 
Selecting target: 
Debug 
Adding source dir: C:\Documents and Settings\Christian Ekiza\Mis documentos\My Dropbox\Private Files\coding\juego_pruebas_01\juego_pruebas_01\ 
Adding source dir: C:\Documents and Settings\Christian Ekiza\Mis documentos\My Dropbox\Private Files\coding\juego_pruebas_01\juego_pruebas_01\ 
Adding file: bin\Debug\juego_pruebas_01.exe 
Starting debugger: 
done 
Registered new type: wxString 
Registered new type: STL String 
Registered new type: STL Vector 
Setting breakpoints 
Debugger name and version: GNU gdb 6.8 
Child process PID: 3328 
Program received signal SIGSEGV, Segmentation fault. 
In ??()() 

et c'est de la pile des appels

#0 00000000 0x000154e4 in ??() (??:??) 
#1 00409198 __cmshared_create_or_grab() (../../../../gcc-4.4.1/libgcc/../gcc/config/i386/cygming-shared-data.c:140) 
#2 00000000 0x0040131b in __gcc_register_frame() (??:??) 
#3 00000000 0x0040a09b in register_frame_ctor() (??:??) 
#4 00000000 0x00408f42 in __do_global_ctors() (??:??) 
#5 00000000 0x00401095 in __mingw_CRTStartup() (??:??) 
#6 00000000 0x00401148 in mainCRTStartup() (??:??) 

et les registres CPU se terminent par une

'gs' register with a hex value '0x0' 

Je ne sais pas vraiment par où commencer à chercher le problème. N'importe qui peut m'aider ou me diriger dans la bonne direction?

Note: J'utilise Code :: Blocks

+2

Réduit le problème à un exemple de programme minimal. Si ce processus ne vous dit pas quel est le problème, publiez le code du programme exemple minimal complet. Aussi bien que les commandes de construction etc. Cheers & hth., –

+0

J'utilisais 3 fichiers cpp + h, pour les bitmaps, un pour les sprites et un pour un moteur. Les 3 fichiers ont bien fonctionné dans un exemple de programme, mais le mien s'est écrasé. J'ai réduit l'exemple de programme pour simplement peindre un fichier BMP sur l'écran et vérifié qu'il fonctionne toujours.Ensuite, j'ai juste échangé le fichier BMP avec l'un de mes applications. Il s'est écrasé. Après avoir cherché la différence entre les bitmaps, il apparaît que le mien n'était pas dans le bon format, car il s'est écrasé. Après quelques essais et erreurs, j'ai réussi à l'empêcher de tomber en panne, mais l'image était entièrement noire. Puis j'ai trouvé que le BMP devait inclure une palette. – EKI

+0

Maintenant, l'image peut être chargée correctement. Ensuite, je vais essayer de voir que toutes les images sont dans le bon format. Et commencez à ajouter chaque pièce à la fois. – EKI

Répondre

0

Voir, si vous avez une instance globale (s) de la classe avec le constructeur - en cas d'erreur est élevé dans le constructeur et la classe est déclarée globalement (mauvaise chose à faire BTW) - vous obtiendrez sigsegv même avant main(). Si vous avez de telles classes - essayez de refactoriser votre code pour les avoir dans le main (ou une autre fonction) - il sera plus facile de déboguer.

1

Comme vous le dites, c'est une application Windows. Ensuite, tous les problèmes avec le démarrage, j'ai trouvé ADPlus très utile.

EDIT 2:

Vous pouvez également vérifier si User Mode Process Dumper ADPlus ne s'applique pas

+0

v cool, ne savait pas à ce sujet –

+0

Ce ne serait pas mon cas? Quand ne devriez-vous pas utiliser ADPlus? N'utilisez pas ADPlus dans les situations suivantes: Si vous devez résoudre un programme ou un processus qui se ferme de façon inattendue au démarrage. Vous ne pouvez utiliser ADPlus que pour les processus qui démarrent correctement. Pour résoudre les processus qui se ferment de manière inattendue au démarrage, le vidage de processus en mode utilisateur peut être une meilleure solution. Pour plus d'informations sur vidage de processus en mode utilisateur, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft: 253066 ... Dois-je essayer ce "vidage de processus en mode utilisateur"? – EKI

+0

Oups! Votre commentaire et mon REEDIT se sont croisés. Oui c'est vrai. Vous devrez essayer car il s'agit d'une violation d'accès plutôt que d'une résiliation imprévue. La fin inattendue est différente de la violation d'accès. – Chubsdad

0

me semble comme l'un de vos dépendances DLL ne peut pas être chargé ou correctement instancié.

0

Avez-vous compilé avec le mode de débogage (-g) activé?

Considérez également sérieusement fixer réellement les avertissements. La plupart du temps, ce sont des problèmes réels dans le code qui devraient être résolus.

Vous devriez également essayer de voir si cela se produit avec une main presque vide (commentez la plupart/tout votre code dans main).