web-dev-qa-db-fra.com

Contre le code de sortie 139 lors de l'exécution, mais gdb le fait

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!

15
ulyssis2

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.

29
Employed Russian

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();
}
1
HamzaMushtaq