gpt4 book ai didi

linux - 当我从 Docker 容器中运行 gdb 时,它没有遇到任何断点

转载 作者:IT老高 更新时间:2023-10-28 12:42:59 28 4
gpt4 key购买 nike

问题

如果我从主机编译和运行,我可以设置并到达断点,但如果我从 docker 容器中执行此操作,gdb 不会命中设置的断点。

复制步骤(所有片段都可以复制粘贴)

创建一个 docker 文件:

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

构建镜像并在其中运行交互式 session :

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

从容器内部创建小的 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')并成功退出。我想这里最重要的是程序确实运行了并且消息在启动程序正常退出时是异常行为(根据GDB ignores my breakpoints)

问题

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

到目前为止我尝试了什么

  1. 如建议 here ,我尝试在 /etc/apparmor.d/docker 中更改一行(我是在主机中完成的):将 profile docker-default flags=(attach_disconnected,mediate_deleted) { 替换为 profile docker-default flags=(attach_disconnected,mediate_deleted,complain) {。然后运行docker容器,编译,gdb。结果是一样的:在启动过程中程序正常退出

  2. 正如 another answer 中的建议,在容器中,我尝试执行 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——这给了我同样的错误。我必须承认我不明白 docker 是如何管理用户权限的,即容器内的 root 拥有哪些用户权限以及它从谁那里继承了这些权限(来自 docker 守护进程?)。由于我能够打断点,所以当我在主机中运行 gdb 时,我怀疑我的问题会归结为用户权限,但我不知道如何解决。

  3. 在我尝试做的主机中 echo 0 | sudo tee/proc/sys/kernel/yama/ptrace_scope 如尚未 another answer 中的建议.

最佳答案

2020.01.04 更新:使用 answerKevin W Matthews 给出--- 更好,因为它在不提升整个容器的情况下授予必要的个人能力。


tldr;使用

docker run --privileged

Longer:我有一些 problems with gdb in docker ---它试图(但失败)禁用address space layout randomization --- 但只在 docker-machine 上,不在我的原生 linux 主机上。

当 gdb 未能禁用 ASLR 时,我的所有断点都将被忽略。使用 --privileged 标志解决了我的问题。您的里程可能会有所不同。

关于linux - 当我从 Docker 容器中运行 gdb 时,它没有遇到任何断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856092/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com