So drucken Sie eine <unvollständige Typ>-Variable in GDB
-
04-07-2019 - |
Frage
Manchmal gibt GDB für bestimmte Variablentypen „unvollständigen Typ“ aus.Was bedeutet das und wie können wir diesen Wert erkennen?
Lösung
Dies bedeutet, dass die Art dieser Variablen unvollständig angegeben wurde. Zum Beispiel:
struct hatstand;
struct hatstand *foo;
GDB weiß das foo
ist ein Zeiger auf a hatstand
Struktur, aber die Mitglieder dieser Struktur wurden nicht definiert. Daher "unvollständiger Typ".
Um den Wert zu drucken, können Sie ihn auf einen kompatiblen Typ werfen.
Zum Beispiel, wenn Sie das wissen foo
ist wirklich ein Zeiger auf a lampshade
Struktur:
print (struct lampshade *)foo
Oder Sie können es als generischer Zeiger drucken oder es so behandeln, als wäre es eine Ganzzahl:
print (void *)foo
print (int)foo
Siehe auch diese Seiten aus dem GDB -Handbuch:
Andere Tipps
Ich habe festgestellt, dass, wenn Sie eine Funktion zerlegen, die die unvollständigen Struktur -Typ -GDB verwendet, die Strukturelemente entdeckt und sie anschließend anzeigen können. Angenommen, Sie haben eine String -Struktur:
struct my_string {
char * _string,
int _size
} ;
Einige Funktionen zum Erstellen und Erhalten der Zeichenfolge über Zeiger:
my_string * create_string(const char *) {...}
const char * get_string(my_string *){...}
und ein Test, der eine Zeichenfolge erstellt:
int main(int argc, char *argv[]) {
my_string *str = create_string("Hello World!") ;
printf("String value: %s\n", get_string(str)) ;
...
}
Führen Sie es in GDB aus und versuchen Sie, *strieren zu drucken, und Sie erhalten eine unvollständige Antwort. Versuchen Sie jedoch "Disassemble get_string" und dann "Drucken *str" und es wird die Struktur und die Werte ordnungsgemäß angezeigt. Ich habe keine Ahnung, warum das funktioniert, aber es tut es.
Ich hatte das gleiche Problem. Wenn Sie die Symbole manuell aus Ihren Bibliotheken laden:
set auto-solib-add off
attach thread_id
shared any_lib
shared another_lib
Sie müssen die Symbole aus der Bibliothek laden, in der dieses Objekt deklariert wird, auch mit demselben Befehl.
Ich kenne die volle Bedeutung des Fehlers nicht, aber wie Peter bemerkt, macht die Demontage einer verwandten Methode etwas, das einige dieser Typdefinitionen zur Verfügung stellt.
Mein Beispiel:
In der .H für eine Klasse enthielt diese Klasse eine Vorwärtsdeklaration einer inneren Helferklasse, damit die äußere Klasse einen Zeiger auf sie enthalten konnte. Das entsprechende .CPP hatte die vollständige Kursdefinition für innere Helfer.
Beim Einbruch einer Methode der äußeren Klasse berichtete GDB unvollständiger Typ für eine Derreferenz des Zeigers auf die Inner -Klasse -Instanz durch eine Instanz der äußeren Klasse.
Durch die Ausgabe des Katastrophenbefehls zu einer der Methoden in der äußeren Klasse konnte GDB die Struktur der inneren Klasse unter Verwendung des zuvor fehlgeschlagenen Zeigers verstehen.
Haftungsausschluss
Ich bin ein Python-Entwickler mit nur minimalen Kenntnissen in C++ und der Funktionsweise des Linux-Betriebssystems. Daher ist das, was ich unten beschreibe, nur meine Lösung für ein Problem, das ich persönlich erlebt habe.
Wenn Sie versuchen, mit Typen zu arbeiten, die aus Bibliotheken von Drittanbietern stammen, stellen Sie sicher, dass diesen Bibliotheken keine Debuginformationen fehlen.
Beispiel
(gdb) info share Qt
From To Syms Read Shared Object Library
0x00007ffff5336080 0x00007ffff56ba585 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
0x00007ffff4ad3510 0x00007ffff4ef0cbe Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
0x00007ffff47829c0 0x00007ffff47e1ba1 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5
0x00007ffff40bb5e0 0x00007ffff439dd92 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
0x00007ffff2e581e0 0x00007ffff2e78e4f Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Xml.so.5
0x00007ffff28c8a00 0x00007ffff29d9999 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Network.so.5
0x00007ffff2251750 0x00007ffff2252a46 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5X11Extras.so.5
0x00007ffff1cc9f80 0x00007ffff1cfc861 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5PrintSupport.so.5
0x00007fffee269c10 0x00007fffee297b57 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Svg.so.5
0x00007fffed987560 0x00007fffed98b6a8 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5TextToSpeech.so.5
0x00007fffe980e130 0x00007fffe9900c0c Yes (*) /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
0x00007fffe69ef650 0x00007fffe69ffe0d Yes (*) /usr/lib/x86_64-linux-gnu/libQt5QuickControls2.so.5
0x00007fffe5c0f890 0x00007fffe5eae1c1 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Quick.so.5
0x00007fffe5522690 0x00007fffe581f636 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5
0x00007fffe51996b0 0x00007fffe5221363 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5QuickTemplates2.so.5
(*): Shared library is missing debugging information.
^ Allen Qt-Bibliotheken im aktuellen Beispiel fehlen Debug-Informationen.Dies liegt daran, dass Debug-Informationen für QT-Bibliotheken in separaten Paketen enthalten sind, die nicht installiert werden.
Wann immer ich es tat whatis
alles hat gut geklappt:
(gdb) whatis e
type = QEvent *
aber als ich versuchte, auf die Mitglieder zuzugreifen
(gdb) p e->type()
Couldn't find method QEvent::type
und versuchen, eine detaillierte Typbeschreibung zu erhalten
(gdb) ptype e
type = class QEvent {
<incomplete type>
} *
Lösung (für Qt unter Ubuntu)
- Finden Sie heraus, zu welchem Paket in Ihrer Betriebssystemdistribution die Datei gehört
$ dpkg -S /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
libqt5core5a:amd64: /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
Suchen Sie nach verwandten Paketen
Suche mit Schlüsselarbeit
libqt5core5a
2 Pakete zurückgeschickt, eines istlibqt5core5a
sich selbst, und ein anderer istlibqt5core5a-dbgsym
.Die Beschreibung für Letzteres lautet:„Debugsymbole für libqt5core5a“Installieren Sie Pakete mit Debug-Symbolen (ich habe auch Debug-Symbole für einige andere wichtige Qt-Bibliotheken installiert)
$ sudo apt install libqt5core5a-dbgsym libqt5widgets5-dbgsym libqt5gui5-dbgsym
- Stellen Sie sicher, dass Sie dabei sind
gdb
dass Bibliotheken jetzt Debug-Informationen haben
(gdb) info share Qt
From To Syms Read Shared Object Library
0x00007ffff5336080 0x00007ffff56ba585 Yes /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
0x00007ffff4ad3510 0x00007ffff4ef0cbe Yes /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
0x00007ffff47829c0 0x00007ffff47e1ba1 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5
0x00007ffff40bb5e0 0x00007ffff439dd92 Yes /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
0x00007ffff2e571e0 0x00007ffff2e77e4f Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Xml.so.5
0x00007ffff28c7a00 0x00007ffff29d8999 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Network.so.5
0x00007ffff2250750 0x00007ffff2251a46 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5X11Extras.so.5
0x00007ffff1cc8f80 0x00007ffff1cfb861 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5PrintSupport.so.5
0x00007fffee268c10 0x00007fffee296b57 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Svg.so.5
0x00007fffed985560 0x00007fffed9896a8 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5TextToSpeech.so.5
0x00007fffe95fc130 0x00007fffe96eec0c Yes (*) /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
0x00007fffe701f650 0x00007fffe702fe0d Yes (*) /usr/lib/x86_64-linux-gnu/libQt5QuickControls2.so.5
0x00007fffe623c890 0x00007fffe64db1c1 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Quick.so.5
0x00007fffe5b4f690 0x00007fffe5e4c636 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5
0x00007fffe57c66b0 0x00007fffe584e363 Yes (*) /usr/lib/x86_64-linux-gnu/libQt5QuickTemplates2.so.5
(*): Shared library is missing debugging information.
- Jetzt funktioniert die Arbeit mit Qt-Typen wie erwartet
(gdb) p e->type()
$4 = QEvent::Paint
(gdb) ptype e
type = class QEvent {
public:
...
}