Kann keine Variablen in gdb sehen

2133
StoneThrow

Ich bin neu bei cygwin (und * nix für diese Angelegenheit) und verstehe nicht das folgende Verhalten von gdb. Ich habe eine ausführbare Datei erstellt, die absichtlich zu einem SIGSEGV führt:

#include <iostream>  void Func(int i) { int* pFoo = NULL; *pFoo = 1; }  int main(int argc, char** argv) { Func(-50); std::cout << "End of main()" << std::endl; } 

Ich kompiliere meinen Code durch:

g++ test.cpp 

Verwendung dieser Version von g ++:

g ++ --version

g ++ (GCC) 5.4.0 Copyright (C) 2015 Free Software Foundation, Inc. Dies ist freie Software. Siehe die Quelle für die Kopierbedingungen. Es gibt KEINE Garantie. Nicht einmal für MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.

Wenn ich versuche, dieses Programm in gdb auszuführen, kann ich keine Variablen "sehen":

>gdb ./a.exe GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1 Copyright (C) 2015 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-cygwin". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./a.exe...done. (gdb) r Starting program: /home/user/code/gdbtest/a.exe [New Thread 6500.0x1c84] [New Thread 6500.0x7a0]  Program received signal SIGSEGV, Segmentation fault. 0x000000010040111d in Func(int) () (gdb) bt #0 0x000000010040111d in Func(int) () #1 0x000000010040113c in main () (gdb) f 0 #0 0x000000010040111d in Func(int) () (gdb) p i No symbol "i" in current context. (gdb) p pFoo No symbol "pFoo" in current context. (gdb) info locals No symbol table info available. (gdb) f 1 #1 0x000000010040113c in main () (gdb) p argc No symbol "argc" in current context. (gdb) 

Kann jemand erklären, warum dies passiert und wie ich das Problem beheben kann?

Ich habe auch versucht, mit "g ++ -Og test.cpp" zu kompilieren, was jedoch zu keiner Änderung des oben beschriebenen führte.

0

2 Antworten auf die Frage

0
MAP

Wie im GDB-Handbuch beschrieben (das Sie wahrscheinlich vorher prüfen sollten), müssen Sie dem Compiler mitteilen, dass er die Informationen zu Variablen enthält, die GDB benötigt. Fügen Sie den -gSchalter in Ihrer Compilerzeile hinzu:

g++ -g test.cpp 
Ich kann Ihren Vorschlag in wenigen Stunden testen. Vorher jedoch: Der Link, den Sie gesendet haben, besagt "gcc, der C / C ++ - Compiler von gnu, unterstützt '-g' mit oder ohne '-O' und ermöglicht das Debuggen von optimiertem Code." In meinem ursprünglichen Beitrag habe ich festgestellt, dass ich auch mit "g ++ -Og test.cpp" kompiliert habe. Können Sie diese Diskrepanz erklären? Eine zweite Frage: Auf einem echten * nix-System bei der Arbeit (im Vergleich zu Cygwin des ursprünglichen Beitrags) habe ich mit g ++ ohne explizites "-g" kompiliert, aber gdb kann Symbole in dieser Umgebung sehen. g ++ hat kein Alias ​​auf "g ++ -g". Wissen Sie, warum diese Diskrepanz sein kann? Vielen Dank. StoneThrow vor 7 Jahren 0
Klicken Sie bei der Antwort auf das Häkchen, um dies dem Computer mitzuteilen. Es kann den Text nicht verstehen und durch die Prüfung wird diese Frage höher bewertet, wenn die Benutzer die Fragen und Antworten durchsuchen. MAP vor 7 Jahren 0
0
matzeri

Allgemeiner Hinweis: Ist eine schlechte Idee, einen Programmtest aufzurufen, da bereits ein Testbefehl vorhanden ist.

Namensänderung ;-)

$ g++ -ggdb -O0 prova.cpp -o prova 

Woher

-ggdb is the option for adding the debug info -O0 disable all the optimization -o provide a name to the binary other than the default a.exe 

Der Debugging-Abschnitt wird sein:

$ gdb prova GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1 ... Reading symbols from prova...done. (gdb) run Starting program: /tmp/prova/prova [New Thread 6404.0x404] [New Thread 6404.0x231c] [New Thread 6404.0x1960] [New Thread 6404.0x11b4]  Program received signal SIGSEGV, Segmentation fault. 0x00000001004010f7 in Func (i=-50) at prova.cpp:6 6 *pFoo = 1; (gdb) bt #0 0x00000001004010f7 in Func (i=-50) at prova.cpp:6 #1 0x0000000100401122 in main (argc=1, argv=0xffffcc30) at prova.cpp:11 
Dies funktionierte auf (sowie nur "-g"). Immer noch neugierig, warum "-Og" nicht funktionierte, da ich beim Lesen des Handbuchs dachte, es müsste sein. Neugierig, warum auf meinem Arbeits-PC weder "-g" noch "-ggdb" erforderlich sind (was * nix ist). Nur neugierig auf diese Punkte, aber Sie haben meine Frage gelöst. Danke dir. StoneThrow vor 7 Jahren 0