Verwendung von Debug-Bibliotheken auf Ubuntu

7

Mein aktuelles Problem ist libwebkitgtk-3.0-0, aber ich denke, dieses Problem ist generisch genug.

Meine Anwendung stürzt irgendwo im Webkit-Code ab. Meine Annahme ist, dass wir etwas Dummes tun und herausfinden wollen, was. Am einfachsten ist es, einen Haltepunkt zu setzen oder die Debug-Version der Bibliothek zu verwenden.

  1. Wie bekomme ich genauen Quellcode mit welcher Bibliothek gebaut wurde? Ich bekomme Stack-Trace, nachdem es den Kern ablegt, aber die Zeilennummer, die gdb sagt, stimmt nicht mit denen überein, die ich im Code sehe. Mit anderen Worten, wenn ich libwebkitgtk-3.0-0 installiere, möchte ich den genauen Quellcode davon bekommen.

  2. Ich habe die Debug-Version der Webkit-Bibliothek installiert. Haben diese Debug-Versionen die gleiche Funktionalität, als würden Sie Webkit mit --enable-debug flag kompilieren? Debug-Versionen von Webkit ermöglichen die Protokollierung basierend auf der Umgebungsvariablen WEBKIT_DEBUG, aber ich konnte nicht die gleiche Protokollierung erhalten, selbst wenn ich die Debug-Version der Bibliothek verwende.

  3. Wie verwende ich die Debug-Version, die ich kompilieren konnte? Ich habe es geschafft, Webkit auf meinem Rechner zu kompilieren und habe versucht, mit Lastpfaden und so zu spielen. Meine Anwendung übernimmt keine neue gemeinsame Bibliothek, egal was ich mache - ich kann anhand der Signatur des Benutzeragenten sagen. Irgendwann schaffte ich es, die Bibliothek zu holen, aber dann funktioniert SSL nicht mehr. Das gleiche SSL-Problem tritt bei GtkLauncher auf. Also mache ich irgendwo Fehler.

Danke für die Hinweise.

    
user937720 15.01.2013, 18:43
quelle

3 Antworten

1

1) Wenn ich eine Bibliothek durchsuchen muss, die ich über ein Paket installiert habe, installiere ich sie als erstes aus der Quelle. Ich meine configur / make / make install. Normalerweise stelle ich den Quellcode in / usr / local / src und installiere ihn in / usr / local. Dies ist meiner Meinung nach die zuverlässigste Art, den genauen Code auszuführen, für den Sie die Quelle haben.

3)

  

Wie verwende ich die Debug-Version, die ich kompilieren konnte?

Das hört sich so an, als hätten Sie getan, was ich oben beschrieben habe. Was Sie tun müssen, ist sicherzustellen, dass Ihre Software die Include- und Link-Verzeichnisse verwendet, die Ihre kompilierte, debuggeschaltete Bibliothek hosten. Das bedeutet, dass die Flags -I / usr / local / include und -L / usr / local / lib gesetzt sind und sie vor / usr / include und / usr / lib stehen.

Sie können noch sicherer sein, indem Sie die Binärversion der Bibliotheken aus der Ubuntu-Installation entfernen und sicherstellen, dass die Version, die Sie erstellt und installiert haben, die einzige Version auf der Festplatte ist. Auf diese Weise können Sie sicher sein, dass Sie Ihre App für die Verwendung dieser Bibliothek konfigurieren konnten. Sonst wird es einfach scheitern, anstatt sich ständig zu fragen, ob es die neue Bibliothek oder die alte Bibliothek benutzt.

2) Normalerweise ja. Aber es hängt davon ab, wie die Bibliothek geschrieben ist und was der Ubuntu-Packer getan hat.

Wenn Sie das Programm mit Ihrer lokal erstellten Bibliothek kompiliert haben, sehen Sie, ob Sie genau den gleichen Fehler erhalten. Wenn nicht, dann ist das auch ein Datenpunkt. Vielleicht wurde das Problem behoben, seit ubuntu das letzte Mal die Bibliothek gepackt hat. Vielleicht ist die Bibliothek nicht richtig verpackt und das ist das Problem. Sie könnten sogar neue Fehler bekommen, weil der Ubuntu-Packer die Bibliothek auf eine bestimmte Art und Weise konfiguriert hat, so dass es funktioniert und Sie nicht dasselbe getan haben. Du wirst trotzdem interessante Hinweise bekommen.

Viel Glück

    
Spundun 15.01.2013, 19:43
quelle
23

TL; DR: Installieren Sie libwebkitgtk-3.0-0-dbg Installieren Sie libwebkitgtk-3.0-0-dbg http://hostmar.co/software-small , dann haben Sie die notwendigen Debug-Symbole.

Für Debug-Symbole müssen Sie normalerweise nicht von der Quelle installieren.

Wie Sie wissen, können Sie GCC mit -g ausführen, um Debug-Symbole für Software zu erhalten, die Sie selbst erstellen.

Für Software, die über den Paketmanager Ihres Betriebssystems installiert wird (der libwebkitgtk-3.0-0 enthält), gibt es, zumindest für offizielle Pakete, normalerweise auch Pakete, die Debug-Symbole bereitstellen .

Sie müssen nicht unbedingt einen Debug-Build eines Programms oder einer Bibliothek erstellen, um eine symbolische Stack-Ablaufverfolgung in gdb zu erhalten. gdb unterstützt auch Dateien, die "Add-On" Debug-Symbole in /usr/lib/debug bereitstellen.

Sie verwenden Ubuntu entsprechend den Tags Ihrer Frage. Unter Ubuntu sind Debug-Symbolpakete in zwei Varianten verfügbar: -dbg und -dbgsym . Ein Programm oder eine Bibliothek, die sich in /path befindet, erhält Debug-Symbole bei /usr/lib/debug/path .

-dbg Pakete

Diese Pakete werden oft anders benannt als die entsprechenden Pakete, die die eigentlichen ausführbaren Dateien oder Bibliotheksdateien enthalten. Sie werden oft ähnlich wie -dev packages (die Header-Dateien bereitstellen) und -doc packages benannt. Ein -dbg -Paket weist im Namen manchmal eine geringere Nummerierung der Bibliotheksversion als die eigentlichen Bibliothekspakete auf und deckt manchmal Binärdateien ab, die in mehreren anderen Paketen enthalten sind.

Zum Beispiel ist libgtkmm-3.0-1 das entsprechende -dbg -Paket libgtkmm-3.0-dbg .

Andererseits wird manchmal ein Paket -dbg genauso benannt wie das Paket, dessen Symbole es enthält (mit Ausnahme des Suffix -dbg ). Zum Beispiel ist libwebkitgtk-3.0-0 das entsprechende -dbg -Paket libwebkitgtk-3.0-0-dbg . Das ist das, was Sie wollen.

Sie können es im Software Center installieren oder indem Sie Folgendes ausführen:

%Vor%

Wenn Sie nun ein Programm debuggen, das auf eine von libwebkitgtk-3.0-0 bereitgestellte Bibliothek verweist, lädt gdb automatisch Symbole aus einer Datei, die von libwebkitgtk-3.0-0-dbg bereitgestellt wird.

-dbgsym Pakete

Manchmal enthalten binäre ausführbare Dateien, die von einem offiziellen Paket bereitgestellt werden, keine Symbole, die in einem -dbg -Paket enthalten sind. In diesem Fall können Sie normalerweise das Paket -dbgsym installieren.

Im Gegensatz zu -dbg packages, -dbgsym packages:

  • sind fast immer einfach (und vorhersagbar) benannt X-dbgsym wobei X das Paket ist, das das Programm oder die Bibliothek selbst bereitstellt.
  • werden von speziellen Softwarequellen (Repositories), nicht den gleichen Softwarequellen wie die entsprechenden Programm- / Bibliothekspakete und -dbg packages bereitgestellt.

Da sich -dbgsym -Pakete in separaten Repositories befinden, müssen Sie diese Repositories aktivieren. Ihre DEB-Zeilen sind:

%Vor%

Um sie zu aktivieren, können Sie diese Befehle ausführen (angepasst von DebuggingProgramCrash von "Weiterverteiler zum Ubuntu-Dokumentations-Wiki , Abschnitt 2 ):

%Vor%

Lassen Sie die Zeilen kursiv weg, wenn Sie sich in einer Entwicklungsversion (Alpha oder Beta) befinden. Stellen Sie sicher, dass Sie sie hinzufügen, wenn Sie das Release weiterhin stabil verwenden.

Diese Befehle machen drei Dinge:

  1. Erstellen Sie die Datei /etc/apt/sources.list.d/ddebs.list (die die DEB-Zeilen enthält).
  2. Importieren Sie den Signaturschlüssel für diese Repositories.
  3. Aktualisieren Sie die Systeminformationen darüber, welche Pakete und Versionen für die Installation von wo verfügbar sind.

Wenn Sie also die -dbgsym -providierten Symbole anstelle der -dbg bereitgestellten Symbole verwenden möchten, ist das -dbgsym -Paket für libwebkitgtk-3.0-0 (in Übereinstimmung mit der obigen einfachen Namenskonvention) libwebkitgtk-3.0-0-dbgsym .

Sie können sowohl -dbg als auch -dbgsym Pakete auf demselben System installiert haben, aber nicht, wenn sie Symbole für die gleichen Dateien bereitstellen . Also kollidieren libwebkitgtk-3.0-0-dbg und libwebkitgtk-3.0-0-dbgsym miteinander; Sie können nicht beide (gleichzeitig) installiert werden.

Verwenden der Symbole

Auf den meisten Unix-ähnlichen Betriebssystemen sucht der Debugger automatisch nach installierten Symbolen. Ubuntu ist nicht anders - in Ubuntu sucht gdb automatisch nach ihnen in /usr/lib/debug . Sie müssen also nichts Besonderes tun.

Wenn Sie jedoch gdb mitteilen müssen, dass eine bestimmte Debugsymbol-Datei geladen werden soll, verwenden Sie das Flag -s file . Siehe das GNU-Handbuch und gdb (1) für Details.

    
Eliah Kagan 20.01.2013 02:14
quelle
2

@ Eliahs Antwort sagt, wie man Symbole auf bequeme Weise erhält.

Die Frage bleibt, "Wie bekomme ich den genauen Quellcode?" .

Normalerweise mache ich apt-get source <pkgname> , was gut und gut ist, außer dann muss ich gdb dir <path-to-wherever-I-put-the-source> manuell sagen und wehe, wenn es ein Paket wie eglibc ist, wo man herausfinden muss, dass der Pfad verweist stammen aus dem Unterverzeichnis nss , nicht aus dem Stammverzeichnis.

Auf RHEL tut man einfach z.B. yum install --enable-repo rhel-debuginfo libX11-debuginfo (nur yum install libX11-debuginfo auf CentOS 7) und sofort erhalten Sie die vollständigen Symbole und die Quelle in gdb ohne extra herumzualbern. Ich suche immer noch nach dieser Bequemlichkeit auf Ubuntu.

    
Nathan Kidd 09.05.2013 15:50
quelle

Tags und Links