c linux debugging gdb strace

¿Cómo resolver la "operación de seguimiento no permitida" al intentar adjuntar GDB a un proceso?



linux debugging (7)

Esto se debe al endurecimiento del kernel en Linux; puede deshabilitar este comportamiento por echo 0 > /proc/sys/kernel/yama/ptrace_scope o modificándolo en /etc/sysctl.d/10-ptrace.conf

Consulte también este artículo sobre este tema en Fedora 22 (con enlaces a la documentación) y este hilo de comentarios sobre Ubuntu y.

Estoy tratando de adjuntar un programa con gdb pero me devuelve:

Adjuntar al proceso 29139 No se pudo adjuntar al proceso. Si su uid coincide con el uid del proceso de destino, verifique la configuración de / proc / sys / kernel / yama / ptrace_scope, o intente nuevamente como usuario root. Para más detalles, consulte /etc/sysctl.d/10-ptrace.conf ptrace: operación no permitida.

edb-debugger devuelve "No se pudo adjuntar al proceso, verifique los privilegios y vuelva a intentarlo".

strace devuelve "attach: ptrace (PTRACE_ATTACH, ...): operación no permitida"

Cambié "kernel.yama.ptrace_scope" 1 a 0 y "/ proc / sys / kernel / yama / ptrace_scope" 1 a 0 e intenté "establecer el entorno LD_PRELOAD =. / ptrace.so" con esto:

#include <stdio.h> int ptrace(int i, int j, int k, int l) { printf(" ptrace(%i, %i, %i, %i), returning -1/n", i, j, k, l); return 0; }

pero todavía devuelve el mismo error. ¿Cómo puedo adjuntarlo a los depuradores?


Me enfrenté al mismo problema e intenté muchas soluciones, pero finalmente encontré la solución, pero realmente no sé cuál era el problema. Primero modifiqué el valor ptrace_conf e inicié sesión en Ubuntu como raíz, pero el problema sigue apareciendo. Pero lo más extraño que sucedió es que el gdb me mostró un mensaje que dice:

Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user.
For more details, see /etc/sysctl.d/10-ptrace.conf warning: process 3767 is already traced by process 3755 ptrace: Operation not permitted.

Con el comando ps terminal, el proceso 3755 no estaba en la lista.

Encontré el proceso 3755 en / proc / $ pid pero no entiendo qué fue !!

Finalmente, eliminé el archivo de destino (foo.c) que trato de adjuntar vid gdb y el programa tracer c usando PTRACE_ATTACH syscall, y en la otra carpeta, creé otro programa c y lo compilé.

el problema se resolvió y se me permitió conectarlo a otro proceso mediante gdb o ptrace_attach syscall.

(gdb) attach 4416

Adjuntando al proceso 4416

y envié muchas señales al proceso 4416. Lo probé con gdb y ptrace, ambos funcionan correctamente.

Realmente no sé cuál era el problema, pero creo que no es un error en Ubuntu, como lo han referido muchos sitios, como https://askubuntu.com/questions/143561/why-wont-strace-gdb-attach-to-a-process-even-though-im-root


Me gustaría agregar que necesitaba --security-opt apparmor=unconfined junto con las opciones que @wisbucky mencionó. Esto fue en Ubuntu 18.04 (cliente Docker y host). Por lo tanto, la invocación completa para habilitar la depuración de gdb dentro de un contenedor es:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined


No sé lo que está haciendo con LD_PRELOAD o su función ptrace.

¿Por qué no intentas adjuntar gdb a un programa muy simple? Cree un programa que simplemente imprima repetidamente Hello o algo y use gdb --pid [hello program PID] para adjuntarlo.

Si eso no funciona, entonces realmente tienes un problema.

Otro problema es el ID de usuario. ¿Se está configurando el programa que está rastreando a otro UID? Si es así, no puede realizar el seguimiento a menos que esté utilizando la misma ID de usuario o que sea root.


Realmente no abordé el caso de uso anterior pero tuve este problema:

Problema : sucedió que comencé mi programa con sudo , por lo que al iniciar gdb me estaba dando un ptrace: Operation not permitted .

Solución : sudo gdb ...


Si está utilizando Docker, probablemente necesitará estas opciones:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined


Tal vez alguien haya adjuntado este proceso con gdb.

  • ps -ef | grep gdb

no se puede gdb adjuntar el mismo proceso dos veces.