Frage

Kann mir jemand sagen, wie zu tun Laufzeit-debugging auf shared libraries?

Ich muss runtime-debug-Funktion in meiner gemeinsam genutzten Bibliothek, aber die genannt, die von einem anderen Programm.Wie kann ich etwas tun, wie dbx shared libraries?

Ich m mit dbx-AIX.ist gdb besser als dbx-für das, was ich m, der versucht zu tun?.

War es hilfreich?

Lösung

Sie müssen nur mit dem ausführbaren gdb nennen (es spielt keine Rolle, ob es Sie oder eine dritte Partei ist). Hier ist ein Beispiel, wo ich debuggen den ls Befehl und einen Haltepunkt in der (gemeinsam) c Bibliothek . In diesem Beispiel wird GDB 6.8, die (pending) Haltepunkte verschoben unterstützt die diese einfach macht:

gdb /bin/ls
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) b write
Function "write" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (write) pending.
(gdb) r
Starting program: /bin/ls
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
[Thread debugging using libthread_db enabled]
(no debugging symbols found)
(no debugging symbols found)
[New Thread 0x7f98d2d23780 (LWP 7029)]
[Switching to Thread 0x7f98d2d23780 (LWP 7029)]

Breakpoint 1, 0x00007f98d2264bb0 in write () from /lib/libc.so.6
(gdb)

Wie Sie gdb sehen verwaltet automatisch alle Themen von der ausführbaren Datei verwendet. Sie müssen keine speziell dort Fäden nichts zu tun. Der Haltepunkt wird in jedem Thread arbeiten.

Alternativ, wenn Sie den Debugger an einem bereits laufenden Anwendung anhängen möchten (ich verwende tail -f / tmp / ttt hier als Beispiel):

ps ux | grep tail
lothar    8496  0.0  0.0   9352   804 pts/3    S+   12:38   0:00 tail -f /tmp/ttt
lothar    8510  0.0  0.0   5164   840 pts/4    S+   12:39   0:00 grep tail

gdb
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) attach 8496
Attaching to program: /usr/bin/tail, process 8496
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f24853f56e0 (LWP 8496)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...
(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
(no debugging symbols found)
0x00007f2484d2bb50 in nanosleep () from /lib/libc.so.6
(gdb) b write
Breakpoint 1 at 0x7f2484d57bb0
(gdb) c
Continuing.
[Switching to Thread 0x7f24853f56e0 (LWP 8496)]

Breakpoint 1, 0x00007f2484d57bb0 in write () from /lib/libc.so.6
(gdb)

Andere Tipps

Normalerweise eine gemeinsame Bibliothek das Verfahren für die Fehlersuche ist viel das gleiche wie für das Debuggen einer ausführbaren - der Hauptunterschied ist, dass Sie nicht in der Lage sein kann, einen Breakpoint zu setzen, bis die gemeinsame Bibliothek in den Speicher geladen wird. Sie legen den Debugger zum Hauptprogramm.

Wenn Sie eine Anwendung debuggen, die nicht von Ihnen gehört, wird aber mit Ihrem Modul in einer Plugin-Architektur, verwenden Sie immer noch die gleiche Methode. Stellen Sie sicher, (wie immer), die Sie Informationen für Ihre gemeinsame Bibliothek zur Verfügung Debuggen haben. In Fenstern, würden Sie eine PDB-Datei generieren. Mit gcc, ich denke, Sie einen speziellen Compiler-Flag angeben (-G?), Um sicherzustellen, dass Debug-Informationen versorgt wird. Sie legen den Debugger an die Dritte Anwendung.

Ein weiteres Beispiel weiter zu lothar ' s Antwort:

Ich bin der Ausführung von tests auf eine dynamische Bibliothek test.so (zusammengestellt von test.c) in Linux verwenden python und python-unit-Test-Bibliothek unittest genannt tests/test_pwmbasic.py.(Namensschema ist ein bisschen eintönig, ich merke, dass jetzt)

~/my/test/path/
    tests/
        __init__.py
        test_pwmbasic.py
    test.c
    test.so

Ich möchte zum Debuggen, was in test.so von stimulus test_pwmbasic.py.So ist dieses, wie ich es geschafft habe...

$ cd ~/my/test/path
$ gdb $(which python)
   ... gdb blah ...
(gdb) b test.c:179
(gdb) run
>>> from tests.test_pwmbasic import *
>>> import unittest
>>> unittest.main()
   ... unittest blah ...
Breakpoint 1, pwmTest_setDutyCycles (dutyCycles=0x7ffff7ece910) at ./test.c:179
(gdb) print pwm_errorCode
$1 = PWM_ERROR_NONE

und jetzt will ich heiraten gdb

Hinweis: test.c enthält auch ../pwm.c,, so kann ich auch Haltepunkt in der Bibliothek mit

(gdb) b pwm.c:123

Ich erinnere mich, gemeinsam genutzte Bibliotheken testen, indem ein Mock-App erstellen, die es verwendet. Wenn Sie bereit sind, eine Menge Arbeit zu tun, könnten Sie eine zweite, Mock gemeinsam genutzte Bibliothek erstellen, die nur Informationen sammeln, wie wird die Bibliothek durch den Dritten App verwendet wird, und dann haben Ihre Mock App Replay, dass Informationen.

Natürlich zweifelt nie die Kraft gut aufgestellt, printf und fprintf Anrufe.

Es ist lange her, seit ich dbx auf AIX verwenden musste, und ich konfrontiert zu diesem Problem. Installieren von GDB für mich keine Option war.

dbx  /path/to/your/program
(dbx) run [args to your program]
(dbx) set $ignoreonbptrap           # I kept hitting a trace/bpt trap
(dbx) set $deferevents              # allows setting bp in not loaded shared library
(dbx) set $repeat                   # useful, repeat commands with <enter> tjust like gdb
(dbx) stop in MySharedLibraryFunc   # defers breakpoint
(dbx) cont

Sie könnten versuchen, Kompilieren und Linken die Bibliothek statisch es zu debuggen.
Wenn nur Ihr Bug nach oben zeigt, wenn es kompiliert als geteilt, als das könnten Sie einige Hinweise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top