Kann ich unter Linux GDB verwenden, um einen aktuell ausgeführten Prozess zu debuggen?
Kann ich unter Linux GDB verwenden, um einen aktuell ausgeführten Prozess zu debuggen?
Antworten:
Ja. Verwenden Sie den attach
Befehl. Weitere Informationen finden Sie unter diesem Link . Wenn Sie help attach
an 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
target
Befehl "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 (siehedirectory
Befehl " "). Sie können auch denfile
Befehl " " 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_scope
abhängig von Ihren Anforderungen einstellen . Viele Systeme sind jetzt standardmäßig auf 1
oder 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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
.
Sie können mit an einen laufenden Prozess anhängen gdb -p PID
.
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`
program_name
funktioniert, 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.
-p
vor nicht vergessen program_id
? Möglicherweise muss gdb auch mit sudo ausgeführt werden, um eine Verbindung zu einem laufenden Prozess herzustellen.
Der zu verwendende Befehl lautet, gdb attach pid
wobei pid die Prozess-ID des Prozesses ist, an den Sie eine Verbindung herstellen möchten.
Ja, du kannst. Angenommen, ein Prozess foo
wird ausgeführt ...
ps -elf | grep foo Suchen Sie nach der PID-Nummer gdb -a {PID-Nummer}
Wenn Sie einen Prozess anhängen möchten, muss dieser Prozess denselben Eigentümer haben. Die Wurzel kann an jeden Prozess angehängt werden.
ps -elf scheint die PID nicht anzuzeigen. Ich empfehle stattdessen:
ps -ld | grep foo
gdb -p PID
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 gdb
Befehl.
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>