Ma question semble spécifique, mais je doute qu'elle puisse toujours être un problème de débogage C++.
J'utilise omnet ++ qui sert à simuler un réseau sans fil. omnet ++ lui-même est un programme c ++.
J'ai rencontré un phénomène étrange lorsque j'exécute mon programme (framework inet modifié avec omnet ++ 4.2.2 dans Ubuntu 12.04): la sortie du programme avec le code de sortie 139 (les gens disent que cela signifie une fragmentation de la mémoire) lorsque je touche une certaine partie des codes, lorsque je essayez de déboguer, gdb ne signale rien de mal avec les codes "problématiques" où la simulation se termine précédemment, en fait, le débogage passe par cette partie des codes et génère les résultats attendus.
informations sur la version gdb: GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Quelqu'un pourrait-il me dire pourquoi l'exécution échoue mais pas le débogage?
Merci beaucoup!
code de sortie 139 (les gens disent que cela signifie une fragmentation de la mémoire)
Non, cela signifie que votre programme est mort avec le signal 11
(SIGSEGV
sous Linux et la plupart des autres UNIX), également appelé segmentation fault
.
Quelqu'un pourrait-il me dire pourquoi l'exécution échoue mais pas le débogage?
Votre programme présente un comportement indéfini et peut faire n'importe quoi (cela inclut parfois sembler fonctionner correctement).
Votre première étape devrait exécuter ce programme sous Valgrind et corriger toutes les erreurs qu'il rapporte.
Si après avoir fait ce qui précède, le programme se bloque toujours, alors vous devriez le laisser vider le noyau (ulimit -c unlimited; ./a.out
), puis analysez ce vidage de mémoire avec GDB: gdb ./a.out core
; puis utilisez la commande where
.
cette erreur est également provoquée par une référence de pointeur nulle. si vous utilisez un pointeur qui n'est pas initialisé, cela provoque cette erreur.
pour vérifier qu'un pointeur est initialisé ou non, vous pouvez essayer quelque chose comme
Class *pointer = new Class();
if(pointer!=nullptr){
pointer->myFunction();
}