Kann ich GDB verwenden, um einen laufenden Prozess zu debuggen?

110

Kann ich unter Linux GDB verwenden, um einen aktuell ausgeführten Prozess zu debuggen?

Justin Ethier
quelle

Antworten:

88

Ja. Verwenden Sie den attachBefehl. Weitere Informationen finden Sie unter diesem Link . Wenn Sie help attachan einer GDB-Konsole tippen, erhalten Sie Folgendes:

(gdb) help attach

An einen Prozess oder eine Datei außerhalb von GDB anhängen. Dieser Befehl wird an ein anderes Ziel angehängt, das vom selben Typ ist wie Ihr letzter targetBefehl " info files" (" " zeigt Ihren Zielstapel an). Der Befehl kann eine Prozess-ID, einen Prozessnamen (mit einer optionalen Prozess-ID als Suffix) oder eine Gerätedatei als Argument verwenden. Für eine Prozess-ID müssen Sie über die Berechtigung verfügen, dem Prozess ein Signal zu senden, und es muss dieselbe effektive UID wie der Debugger haben. Bei Verwendung von " attach" für einen vorhandenen Prozess findet der Debugger das im Prozess ausgeführte Programm, sucht zuerst im aktuellen Arbeitsverzeichnis oder (falls nicht dort gefunden) über den Suchpfad der Quelldatei (siehe directoryBefehl " "). Sie können auch den fileBefehl " " verwenden, um das Programm anzugeben und seine Symboltabelle zu laden.


ANMERKUNG: Möglicherweise haben Sie aufgrund der verbesserten Sicherheit im Linux-Kernel Schwierigkeiten, eine Verbindung zu einem Prozess herzustellen, z. B. eine Verbindung zu einem untergeordneten Element einer Shell von einer anderen.

Sie müssen wahrscheinlich /proc/sys/kernel/yama/ptrace_scopeabhängig von Ihren Anforderungen einstellen . Viele Systeme sind jetzt standardmäßig auf 1oder höher eingestellt.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.
Carl Norum
quelle
8
Der Link ist defekt :( Aus meiner Sicht mag ich Antworten wie diese von J. Polfer . Cheers;)
olibre
Ich habe den Link behoben.
Attie
Funktioniert dies auch für eine PID eines Prozesses auf einem Remote-Ziel?
Bionix1441
Sie müssen dann einen Debug-Server auf dem Remote-Ziel ausführen. danach sollte es das gleiche sein.
Carl Norum
Das Flag kann mit geändert werden echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki
108

Sie können mit an einen laufenden Prozess anhängen gdb -p PID.

Nikolai Fetissov
quelle
24

Ja. Du kannst tun:

gdb program_name program_pid

Eine Verknüpfung wäre (vorausgesetzt, es wird nur eine Instanz ausgeführt):

gdb program_name `pidof program_name`
J. Polfer
quelle
Ich weiß nicht, was das tut, aber es funktioniert verdammt noch mal nicht für mich. Es heißt, dass <program_pid> nicht existiert.
Eule
2
Ich finde, dass dies am besten funktioniert, da es die Symboltabelle zusätzlich zum Anhängen an den Prozess lädt. Es sollte beachtet werden, dass dies program_namefunktioniert, wenn Sie sich im selben Verzeichnis wie die Binärdatei befinden. Ich denke, ein Pfad zur Binärdatei würde funktionieren, wenn Sie sich in einem anderen Verzeichnis befinden.
KarateSnowMachine
Hast du das -pvor nicht vergessen program_id? Möglicherweise muss gdb auch mit sudo ausgeführt werden, um eine Verbindung zu einem laufenden Prozess herzustellen.
mxmlnkn
15

Der zu verwendende Befehl lautet, gdb attach pidwobei pid die Prozess-ID des Prozesses ist, an den Sie eine Verbindung herstellen möchten.

David Kanarek
quelle
3

Ja, du kannst. Angenommen, ein Prozess foowird ausgeführt ...

ps -elf | grep foo

Suchen Sie nach der PID-Nummer

gdb -a {PID-Nummer}
t0mm13b
quelle
5
Auf welcher Distribution laufen Sie? Bei Verwendung einer neueren Version von Fedora gibt 'gdb -a' den Fehler "Option -a ist mehrdeutig" aus.
Justin Ethier
1
Das offizielle Argument ist -p / - pid
Mahmoud Al-Qudsi
3

Wenn Sie einen Prozess anhängen möchten, muss dieser Prozess denselben Eigentümer haben. Die Wurzel kann an jeden Prozess angehängt werden.

Milan Kerslager
quelle
2

ps -elf scheint die PID nicht anzuzeigen. Ich empfehle stattdessen:

ps -ld | grep foo
gdb -p PID
Nino Pereira
quelle
2

Am einfachsten ist es, die Prozess-ID anzugeben .

gdb -p `pidof your_running_program_name`

Bitte erhalten Sie die vollständige Liste der Optionen im man gdbBefehl.

Wenn für dasselbe Programm mehrere Prozesse ausgeführt werden, werden die Prozesse mit dem folgenden Befehl aufgelistet.

ps -C program -o pid h
<number>

Dann kann die Ausgabeprozess- ID (Nummer) als Argument für gdb verwendet werden.

gdb -p <process id>
Shuva
quelle