Search code examples
linuxdebuggingdockerlldbarchlinux

Remote LLDB debugging - Docker container


I'm trying to set up a remote debugging with LLDB 4.0.1. There's a docker (17.06.0-ce) container with Arch linux. Docker container is set in privileged mode, so now LLDB can be started in container. Container contains core_service which is Rust executable.

Commands run inside container (lldb) target create target/debug/core_service Current executable set to 'target/debug/core_service' (x86_64). (lldb) process launch Process 182 launched: '/srv/core_service/target/debug/core_service' (x86_64)

Problem exists with remote debugging, lldb-server is started inside container with lldb-server platform --server --listen 0.0.0.0:1234. I can connect from host lldb to container lldb-server, but I can't attach/create processes.

Commands run on host (lldb-server in container = localhost:1234) (lldb) platform select remote-linux Platform: remote-linux Connected: no (lldb) platform connect connect://localhost:1234 Platform: remote-linux Triple: x86_64-*-linux-gnu OS Version: 4.12.4 (4.12.4-1-ARCH) Kernel: #1 SMP PREEMPT Fri Jul 28 18:54:18 UTC 2017 Hostname: 099bd76c07c9 Connected: yes WorkingDir: /srv/core_service (lldb) target create target/debug/core_service Current executable set to 'target/debug/core_service' (x86_64). (lldb) process launch error: connect remote failed (Connection refused) error: process launch failed: Connection refused

How can I fix it? Are there any docker, arch linux settings that would cause this error?

It seems, like there's some problem with lldb-server permissions in docker container.

Commands run on host (lldb-server in container) (lldb) platform shell ps -A PID TTY TIME CMD 1 ? 00:00:00 bash 9 ? 00:00:00 nginx 10 ? 00:00:00 nginx 11 ? 00:00:00 lldb-server 25 ? 00:00:00 core_service 59 ? 00:00:00 lldb-server 68 ? 00:00:00 ps (lldb) platform shell kill -9 25 (lldb) platform process launch target/debug/core_service error: connect remote failed (Connection refused) error: Connection refused (lldb) platform process launch anything error: connect remote failed (Connection refused) error: Connection refused But I can't figure out what can it be. lldb-server is run as root in container, I can execute shell commands using lldb.


Solution

  • There is needed both platform port (1234 in your case) and gdbserver port (randomly generated by default). You can enforce the gdbserver port by lldb-server option --gdbserver-port.

    Tested on Fedora 29 x86_64:

    docker run --privileged -p 5000:5000 -p 5001:5001 fedora bash -c 'dnf -y install lldb;lldb-server platform --server --listen 0.0.0.0:5000 --gdbserver-port 5001'
    

    and

    echo 'int main(){}' >main.c;gcc -g -o main main.c;lldb -o 'platform select remote-linux' -o 'platform connect connect://localhost:5000' -o "target create ./main" -o 'b main' -o 'process launch'
    
    (lldb) process launch
    Process 45 stopped
    * thread #1, name = 'main', stop reason = breakpoint 1.1
        frame #0: 0x000000000040110f main`main at main.c:1
    -> 1    int main(){}
    
    Process 45 launched: '/root/main' (x86_64)
    (lldb) _