linux gdb模式下无反应,linux – 当我从Docker容器内部运行时,gdb没有...

在Docker容器内使用GDB时遇到断点设置无效的问题,程序能够正常运行但不触发断点。尝试了修改AppArmor配置、运行strace等方法,但未解决问题。可能是用户权限或Docker容器内的限制导致。解决方案尚未找到。
摘要由CSDN通过智能技术生成

问题

如果我从主机编译并运行,我可以设置并达到断点,但如果我从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 < main.cpp && g++ -g main.cpp && gdb -ex 'break 5' -ex 'run' ./a.out

#include

int main(int argc, const char *argv[])

{

std::cout << "hi

";

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

2

3 int main(int argc, const char *argv[])

4 {

5 std::cout << "hi

";

6 return 0;

7 }

Starting program: /a.out

hi

During startup program exited normally.

(gdb)

从输出可以看出断点未被击中,尽管程序已执行(打印为“hi”)并成功退出.我想这里最重要的是程序确实运行了,启动程序正常退出时的消息是一种异常行为(根据GDB ignores my breakpoints)

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

到目前为止我尝试了什么

>正如建议的here,我试图改变/etc/apparmor.d/docker中的一行(我在主机中做了):

替换配置文件docker-default flags =(attach_disconnected,mediate_deleted){by profile docker-default flags =(attach_disconnected,mediate_deleted,complain){.然后运行docker容器,compile和gdb.结果是一样的:启动程序正常退出.

>正如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时,我怀疑我的问题会归结为用户权限,但我不知道如何处理它.

>在主机中我试图做回声0 | sudo tee / proc / sys / kernel / yama / ptrace_scope,如another answer所述.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值