Sous Linux, puis-je utiliser GDB pour déboguer un processus en cours d'exécution?
Oui. Utilisez la commande attach
. Départ ce lien pour plus d'informations. Taper help attach
sur une console GDB donne ce qui suit:
(gdb) help attach
Attacher à un processus ou à un fichier en dehors de GDB. Cette commande est attachée à une autre cible, du même type que votre dernière commande "
target
" ("info files
"montrera votre pile cible). La commande peut prendre en argument un identificateur de processus, un nom de processus (avec un identificateur de processus facultatif comme suffixe) ou un fichier de périphérique. Pour un identificateur de processus, vous devez être autorisé à envoie un signal au processus, qui doit avoir le même uid effectif que le débogueur. Lorsque vous utilisez "attach
" pour un processus existant, le débogueur trouve le programme en cours d'exécution dans le processus, en commençant par le répertoire de travail en cours. , ou (s’ils ne le trouvent pas) à l’aide du chemin de recherche du fichier source (voir la commande "directory
"). Vous pouvez également utiliser la commande "file
" pour spécifier le programme et charger sa table de symboles.
REMARQUE: vous pouvez avoir des difficultés à vous attacher à un processus en raison de sécurité améliorée dans le noyau Linux - par exemple, attacher l'enfant d'un shell à un autre.
Vous aurez probablement besoin de définir /proc/sys/kernel/yama/ptrace_scope
en fonction de vos besoins. De nombreux systèmes utilisent maintenant par défaut 1
ou plus.
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.
Vous pouvez vous connecter à un processus en cours avec gdb -p PID
.
Oui. Tu peux faire:
gdb program_name program_pid
Un raccourci serait (en supposant qu'une seule instance est en cours d'exécution):
gdb program_name `pidof program_name`
La commande à utiliser est gdb attach pid
où pid est l'ID de processus auquel vous souhaitez vous connecter.
Oui, vous pouvez. Supposons qu'un processus foo
est en cours d'exécution ...
ps -elf | grep foo cherchez le numéro de PID gdb -a {numéro de PID}
Si l'on veut attacher un processus, ce processus doit avoir le même propriétaire. La racine est capable de s’attacher à n’importe quel processus.
ps -elf ne semble pas montrer le PID. Je recommande d'utiliser à la place:
ps -ld | grep foo
gdb -p PID