¿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.