当前位置: 首页 > 面试题库 >

当我从Docker容器中运行gdb时不会遇到任何断点

邢博涛
2023-03-14
问题内容

问题

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

复制步骤(所有片段均已准备好复制粘贴)

创建一个docker文件:

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

构建图像并在其中运行交互式会话:

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忽略了我的断点)

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

到目前为止我尝试过的

  1. 作为建议在这里,我试图改变在一条线上/etc/apparmor.d/docker(我做到了,在主持人):替代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. 根据另一个答案的建议,我尝试从容器中执行操作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如何管理用户权限,即容器内部的根拥有哪些用户权限,以及它是从谁那里html" target="_blank">继承权限的(从docker守护程序?)。由于我能够达到断点,因此在主机中运行gdb时,我怀疑我的问题归结为用户权限,但我不知道该如何处理。

  1. 在主持人中,我尝试echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope按照另一个答案的建议进行操作。

问题答案:

tldr; 采用

docker run --privileged

更长一点:我在docker中使用gdb遇到了一些问题
-–它试图(并且失败)禁用地址空间布局随机化
-–但仅在docker-machine本地Linux主机上,而不是在上。

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



 类似资料:
  • 我已经通过SSH(从我的主机)访问了一台远程机器(称之为RM)。我正在通过SSH会话在RM中运行一个docker映像。两者都基于Ubuntu16.04。 我正在这样做,因为出于某种目的我必须重新启动我的主机。 PS:在这个链接中正确的方式从容器中分离而不停止它,它不是通过SSH会话运行docker容器。所以两种情况是不同的。

  • null 虽然我不能让cron在那个特定的容器中工作,但我能够为cron创建一个独立的docker容器,并成功地使它自动运行。 至于cron容器的设置,我遵循了链接的文章,使用Docker-Julien Boulay运行了一个cron作业,并且能够使其工作。

  • 我有以下Dockerfile: 以及以下docker-compose.yml: 如果我通过docker cmd以以下方式手动运行Dockerfile: 看起来一切正常,我得到了它实际执行的应用程序输出日志: 但是,当我试图通过docker-comment以以下方式执行我的应用程序时: 我的应用程序似乎启动正常,但无法继续执行。以下是输出: 我尝试执行show logs命令: 但我得到的唯一记录是第

  • 我对处理是完全陌生的,我想通过创建一个简单的绘制矩形的草图来测试它,然而,当我运行草图时,会弹出一个没有任何内容的窗口。我试着把它填满,在上面画一个提纲,还有其他各种事情,但什么都没发生。我认为这不是代码的问题,而是应用程序本身的问题,我不知道如何修复它。我正在windows上使用processing 3.5.4。 代码: 预期输出:屏幕上显示一个正方形。 输出:没有显示