当我从Docker容器中运行它时,gdb没有命中任何断点

问题

我能够设置和达到一个断点,如果我从主机编译和运行,但如果我从docker容器内做到这一点gdb不会击中设置的断点。

重现步骤(所有片段都准备好复制粘贴)

创build一个docker文件:

cat << EOF > Dockerfile FROM ubuntu RUN apt-get update RUN apt-get install -y build-essential gdb EOF 

构build一个图像并在其中运行一个交互式会话:

 docker build -t gdb_problem_testing . && docker run --rm -it gdb_problem_testing bash 

从容器内部创build一个小的main.cpp,编译并运行gdb:

 cat <<EOF > main.cpp && g++ -g main.cpp && gdb -ex 'break 5' -ex 'run' ./a.out #include <iostream> int main(int argc, const char *argv[]) { std::cout << "hi\n"; return 0; } EOF 

观察gdb输出:

 GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 [Skipped gdb greeting] Reading symbols from ./a.out...done. Breakpoint 1 at 0x40078c: file main.cpp, line 5. 1 #include <iostream> 2 3 int main(int argc, const char *argv[]) 4 { 5 std::cout << "hi\n"; 6 return 0; 7 } Starting program: /a.out hi During startup program exited normally. (gdb) 

从输出结果可以看出,虽然程序已经执行(打印出“hi”)并且已经成功退出,但是断点没有被触发。 我猜这里最重要的是程序确实运行了, 启动程序正常退出的消息是一个exception的行为(根据GDB忽略我的断点 )

什么是阻止gdb设置断点以及如何解决这个问题?

我到目前为止所尝试的

  1. 正如我在这里所build议的,我尝试在/etc/apparmor.d/docker更改一行(我在主机上):替代profile docker-default flags=(attach_disconnected,mediate_deleted) {通过profile docker-default flags=(attach_disconnected,mediate_deleted,complain) { profile docker-default flags=(attach_disconnected,mediate_deleted) { profile docker-default flags=(attach_disconnected,mediate_deleted,complain) { 。 然后运行docker容器,编译和gdb。 结果是一样的: During startup program exited normally

  2. 正如在另一个答案build议,从容器内,我试图做strace -f -o syscall.txt gdb ./a.out ,但我得到以下错误:

     strace: test_ptrace_setoptions_followfork: PTRACE_TRACEME doesn't work: Permission denied strace: test_ptrace_setoptions_followfork: unexpected exit status 1 

    但我不明白如何解决这个问题。 我尝试以root身份启动容器: sudo docker run --rm -it gdb_problem_testing bash然后尝试了strace – 这给了我同样的错误。 我必须承认,我不明白用户权限是如何由dockerpipe理的,也就是说,容器内部根用户拥有哪些权限,以及从哪些用户权限(从docker守护进程?)inheritance权限。 由于我能够达到断点,当我在主机上运行gdb时,我怀疑我的问题会归结为用户权限,但是我不知道如何处理它。

  3. 在主机我试图做echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope按照另一个答案中的build议。

Solutions Collecting From Web of "当我从Docker容器中运行它时,gdb没有命中任何断点"

tldr; 使用

 docker run --privileged 

更长:我在Docker中遇到了gdb的一些问题 —它试图(和失败)禁用地址空间布局随机化 —但只在docker-machine ,而不是在我的本地linux主机上。

当gdb无法禁用ASLR时,我的所有断点都将被忽略。 使用--privileged标志修复了我的问题。 你的旅费可能会改变。