it-swarm.com.de

Kann ich GDB zum Debuggen eines laufenden Prozesses verwenden?

Kann ich unter Linux mit GDB einen laufenden Prozess debuggen?

102
Justin Ethier

Ja. Verwenden Sie den Befehl attach. Check out dieser Link für weitere Informationen. Wenn Sie an einer GDB-Konsole help attach Eingeben, 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, und zwar vom selben Typ wie Ihr letzter Befehl "target" ("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 die Berechtigung haben, dem Prozess ein Signal zu senden, und sie muss dieselbe effektive UID wie der Debugger haben. Wenn "attach" für einen vorhandenen Prozess verwendet wird, findet der Debugger das Programm, das im Prozess ausgeführt wird, zuerst im aktuellen Arbeitsverzeichnis oder (falls dort nicht gefunden) unter Verwendung des Suchpfads für die Quelldatei (siehe " directory "Befehl). Sie können auch den Befehl "file" verwenden, um das Programm anzugeben und seine Symboltabelle zu laden.


ANMERKUNG: Möglicherweise können Probleme beim Anhängen an einen Prozess auftreten, weil verbesserte Sicherheit im Linux-Kernel - beispielsweise das Anhängen an das untergeordnete Element einer Shell von einer anderen aus.

Je nach Ihren Anforderungen müssen Sie wahrscheinlich /proc/sys/kernel/yama/ptrace_scope Einstellen. Viele Systeme verwenden standardmäßig 1 Oder höher.

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.
81
Carl Norum

Sie können mit gdb -p PID Eine Verbindung zu einem laufenden Prozess herstellen.

101

Ja. Du kannst tun:

gdb program_name program_pid

Eine Verknüpfung wäre (unter der Annahme, dass nur eine Instanz ausgeführt wird):

gdb program_name `pidof program_name`
22
J. Polfer

Der zu verwendende Befehl ist gdb attach pid Dabei steht pid für die Prozess-ID des Prozesses, an den Sie eine Anlage erstellen möchten.

14
David Kanarek

Ja, du kannst. Angenommen, ein Prozess foo wird ausgeführt ...

 ps-self | grep foo 
 
 sucht nach der PID-Nummer 
 
 gdb -a {PID-Nummer} 
3
t0mm13b

Wenn ein Prozess angehängt werden soll, muss dieser Prozess denselben Eigentümer haben. Der Root kann sich an jeden Prozess anhängen.

3
Milan Kerslager

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

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