GDB backtrace zeigt nicht die Funktion Namen
Den ich kompiliert habe, meine Bibliothek (speziell protbuf-2.3.0) mit -g -O0
auf einem SunOS 5.10.
Eine Beispiel-Zeile in der log steht dies:
/bin/bash ../libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c -o text_format.lo `test -f 'google/protobuf/text_format.cc' || echo './'`google/protobuf/text_format.cc
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I.. -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c google/protobuf/text_format.cc -fPIC -DPIC -o .libs/text_format.o
Und dann, ich legte meinen gdb mit den folgenden Schritten:
- Meine Anwendung (in diesem Fall my web-server startet ein java-web-app, die verwendet eine library über jni während des Startvorgangs).
- Ich legte mein gdb an den Prozess über
gdb -p XXX
(wobei XXX die pid habe ich vonps
). - Und dann lud ich meine Bibliothek aus der gdb mit
file libprotobuf.so
von der gdb Eingabeaufforderung.
Aber ich kann nicht sehen, meine Funktion, die Namen von bt
. Mein GDB backtrace Befehl zeigt so etwas wie dies:
(gdb) bt
#0 0xf8f98914 in ?? ()
#1 0xf8f98830 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Ich auch versucht zu tun #1 & #2, #1 & #3, und #1 & gdb libprotobuf.so -p XXX
.
Abgesehen von diesen, ich habe auch versucht mit meinem jvm auf debug-Modus und hat einen Haltepunkt auf die System.loadLibrary(..)
Befehl, und nachdem wir über diesen Befehl, ich habe dann die gdb-Anlage-Prozess wieder....aber immer noch nichts.
Allerdings bin ich in der Lage, um Haltepunkte gegeben Funktionsnamen und eine Liste der Inhalt einer Funktion über list
. Aber dann wieder, ich kann zwar breakpoints, aber Sie nicht zu stoppen, als auch auf die Funktion Namen (ich weiß, es ging um die Funktion, weil es in der jvm-hs_err_pid Bericht nach jeder jvm-crash).
Irgendwelche Ideen kommen, es geht nicht zeigt mir meine Funktionsnamen?
- Wahrscheinlich sind Sie nicht berufen GDB korrekt. Bitte zeigen, wie die ausführbare Datei verlinkt wurde und wie Sie befestigt GDB zu.
- Danke, ich habe jetzt mehr Informationen auf der gdb-Anlage verarbeitet, die ich ausprobiert habe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist wahrscheinlich, dass der GDB nicht wissen, wie um herauszufinden, volle Pfad für ausführbare Datei für den angegebenen PID. Wenn es wussten vollständigen Pfad, Sie würden es nicht tun müssen Schritt #3 -- GDB würde Hinzugefügt haben automatisch.
Können Sie überprüfen, ob der GDB ableiten ausführbare Datei-Namen korrekt mit
(gdb) info file
Befehl.Wenn meine Vermutung richtig ist, helfen, GDB, indem er wie dieser:
Sollte sofort lösen alle Ihre Probleme.
Darüber hinaus werden Sie sicher, dass die ausführbare Datei, die verwendet Ihre Bibliothek ist nicht immer irgendwo abgestreift.
Ich denke das ist eine Verknüpfung problem. Du kannst dir-Befehl ausgeführt wird, zum Zeitpunkt der Verlinkung nicht erkennbar. Hoffe, das wird helfen.