gcc -g: was wird passieren
Diese Frage wurde mir in einem interview.
fragten Sie mich, wie zu generieren, die einen core-dump-Datei, mit der ich Debuggen kann.
dann sagte ich, dass mit -g
fahne in gcc
wir es tun können.
dann haben Sie mich gefragt, was genau bedeutet, dass -g
Flagge tun, um den compiler.
sagte ich (wohl eine falsche Antwort) , es öffnet sich alle Symbole, die in der core-Datei, die für das debugging verwendet werden.
kann mir jemand sagen, was genau tut es?
InformationsquelleAutor der Frage Vijay | 2011-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist schon richtig, aber unvollständig.
-g
Anforderungen, die der compiler und linker erzeugen und beibehalten symbol-Informationen in die ausführbare Datei selbst.Wenn das Programm geschieht, um Sie später zu Abstürzen und produzieren eine core-Datei (die deutet auf ein problem in den tatsächlichen code), oder eine bewusste OS Befehl gezwungen, es in den core (z.B.
kill -SIGQUIT
pid), oder das Programm ruft eine Funktion, die core-dumps (z.B.Abbrechen
) - von denen keine tatsächlich verursacht durch die Verwendung von-g
- dann wird der debugger wissen, wie zu Lesen, dass "-g
" - symbol Informationen aus der ausführbaren Datei-und cross-reference Sie mit dem Kern. Dies bedeutet, dass können Sie sehen, die richtige Namen von Variablen und Funktionen in Ihrem stack-frames, get-Zeile zahlen und sehen Sie die Quelle, wie Sie Schritt um in die ausführbare Datei.Dieses symbol ist nützlich, wenn debugging - ob Sie begonnen, mit einem Kern oder einfach nur die ausführbare Datei allein. Es hilft sogar besseren output von Befehlen wie
pstack
.UPDATE pro Victor ' s Wunsch in die Kommentare...
Symbol-Informationen Listen Bezeichner aus der source-code (in der Regel erst, nachdem alle die name manglings benötigt), die den (virtuellen) Speicher-Adressen/offsets, an denen Sie geladen werden, in den Prozess-Speicher, die Art (z.B. Daten vs. code). Zum Beispiel...
Beachten Sie, dass unsere Funktionen
f()
undmain()
TypT
g_my_num
istB
als Globale implizit mit null-ed-out-Speicher, währendNS::ns_my_num
istD
wie die ausführbare Datei muss explizit den Wert2
zu besetzen, dass der Speicher. Der Mann/die info-Seite fürnm
dokumentieren diese Dinge....InformationsquelleAutor der Antwort Tony Delroy
Die -g-flag weist den compiler zum generieren von debugging-Informationen. Es hat keine Auswirkungen darauf, ob oder nicht eine core-Datei erzeugt wird. Auf den meisten unix-ähnlichen Systemen, kann das setup mit dem Befehl ulimit.
InformationsquelleAutor der Antwort Axel
Den gcc -g flag erzählt gcc zu erzeugen und einbetten von debug-Informationen.
ulimit -c
wird benutzt, um die core-Datei generation. Sie können entweder von diesen ohne das andere.InformationsquelleAutor der Antwort Erik
core-Datei erzeugt "Segmentation Fault" oder solche Ausnahmen.
gdb source.cc core
ist ein Weg, Blick in die core-Datei. Backtrace und untersucht jeden frame ist ein start bei der Suche in den Kern.-g
fügt debugging-Symbole in der binären.InformationsquelleAutor der Antwort vpit3833
-g
fügt debug-Informationen (Variablennamen, Zeilennummern etc.), um die ausführbare Datei. Es ist ein Teil von dem, was Sie tun müssen, um in der Lage sein, den Sinn der core-Datei.http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
InformationsquelleAutor der Antwort JeremyP
core dump ist eine von einer Standard-Prozesse-Aktionen, wenn dieser Prozess empfängt die Signale, z.B. in den standard-Signalen "SIGQUIT", "SIGILL", "SIGABRT", "SIGFPE", "SIGSEGV". Jedoch, die meisten Muscheln unterdrücken die Erstellung der core-Datei, einfach weil die core-Dateien sind in der Regel groß und es kann einige Zeit dauern, oder eine Menge Zeit.
damit die core-generation, "ulimit" ist das Dienstprogramm, das Sie verwenden können, um die shell oder seinen Kindern Prozess-Datei begrenzen.
compiler-Schalter "-g" oder was auch immer nur darum mit compiler. logisch gesehen, es hat nichts zu tun mit core dump.
InformationsquelleAutor der Antwort pepero
Wenn Sie nicht setzen -g-flag, können keine Anrufliste in der gdb-Liste, was den source-code aussieht. es wird sich zeigen "Keine Symboltabelle geladen. Verwenden Sie die "Datei" - Befehl."
Auch wenn Sie info func-oder info-frame, info einheimischen in gdb, ohne -g wird es nicht zeigen, Rückgabe-Datentyp und seine Argumente grundsätzlich keine übersetzung der Anleitung zu Variablen (Zuordnung von symbol-Tabelle).
InformationsquelleAutor der Antwort Steven Wong