Criei uma imagem docker com gcc
o binutils e gdb
o debugger instalados dentro.
Eu anexaria gdb
desse contêiner docker a um processo dentro de um lxc
contêiner em execução no mesmo host Linux. O lxc
contêiner usa seu próprio PID
namespace, portanto, gdb
a execução no contêiner docker reclama que o processo de destino e o depurador não estão no mesmo PID
namespace.
[SR-PCE-251:~]$ docker run -it --pid host --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined carlo/ubuntu
root@e7b2db23af34:/#
root@e7b2db23af34:/# id
uid=0(root) gid=0(root) groups=0(root)
root@e7b2db23af34:/#
root@e7b2db23af34:/# gdb -q attach 11365
attach: No such file or directory.
Attaching to process 11365
[New LWP 24283]
[New LWP 20025]
[New LWP 20024]
[New LWP 19992]
[New LWP 19991]
[New LWP 13974]
[New LWP 13970]
[New LWP 13969]
[New LWP 13968]
[New LWP 13967]
[New LWP 13962]
[New LWP 13958]
[New LWP 13957]
[New LWP 13954]
[New LWP 13952]
[New LWP 13944]
[New LWP 12078]
[New LWP 11822]
[New LWP 11543]
[New LWP 11515]
[New LWP 11489]
[New LWP 11483]
[New LWP 11482]
[New LWP 11477]
[New LWP 11476]
warning: "target:/proc/11365/exe": could not open as an executable file: Operation not permitted.
warning: `target:/proc/11365/exe': can't open to read symbols: Operation not permitted.
warning: Could not load vsyscall page because no executable was specified
warning: Target and debugger are in different PID namespaces; thread lists and other data are likely unreliable. Connect to gdbserver inside the container.
0x00007f0bf997ac73 in ?? ()
(gdb)
Como posso me livrar disso?
Você não pode fazer isso; a ideia dos namespaces PID é que um namespace não pode inspecionar os processos do outro (desde que não seja uma bifurcação do mesmo namespace).
Então, você pode não ter construído o contêiner mais útil, a menos que queira convencer o docker a não descompartilhar o namespace PID mestre para esse contêiner (
docker run --pid=host
, se não me engano). Parece ser um pouco antitético, pois você vai querer compartilhar o namespace de montagem do contêiner inspecionado também, para realmente conseguir ler executáveis e bibliotecas. Então você precisa convencer o gdb onde procurar por esses caminhos... O que no final significa que seu contêiner GDB é basicamente equivalente a um diretório com um script que se curvaPATH
eLD_LIBRARY_PATH
para que um GDB personalizado possa ser chamado desse diretório, mas mais complicado de usar na prática.Eu recomendo que você não faça isso, mas execute um gdbstub no contêiner de destino. Você pode então se conectar a ele como um monitor remoto do seu GDB local (seja em um contêiner ou "global").