Frage

Manchmal gibt GDB für bestimmte Variablentypen „unvollständigen Typ“ aus.Was bedeutet das und wie können wir diesen Wert erkennen?

War es hilfreich?

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)

  1. 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
  1. Suchen Sie nach verwandten Paketen

    Suche mit Schlüsselarbeit libqt5core5a 2 Pakete zurückgeschickt, eines ist libqt5core5a sich selbst, und ein anderer ist libqt5core5a-dbgsym.Die Beschreibung für Letzteres lautet:„Debugsymbole für libqt5core5a“

  2. 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
  1. 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.
  1. Jetzt funktioniert die Arbeit mit Qt-Typen wie erwartet
(gdb) p e->type()
$4 = QEvent::Paint
(gdb) ptype e
type = class QEvent {
  public:
...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top