如何在docker的容器中使用gdb

2023-03-06 13:25:20 浏览数 (1)

解决方案

话不多说,先上答案:在运行容器的时候,使用参数--cap-add sys_ptrace,比如:

代码语言:javascript复制
docker run --cap-add sys_ptrace homqyy/example_http

问题原因

由于docker运行的容器默认是将“追踪”能力给关掉的,因此我们需要手动的打开。关于“追踪”能力的原文如下所示:

capabilities(7) — Linux manual page CAP_SYS_PTRACE * Trace arbitrary processes using ptrace(2); * apply get_robust_list(2) to arbitrary processes; * transfer data to or from the memory of arbitrary processes using process_vm_readv(2) and process_vm_writev(2); * inspect processes using kcmp(2).

触类旁通法

docker除了提供系力度的能力控制(--cap-add--cap-del)外,还提供了一个能力全开放的选项“--privileged”,因此我们可以如此排查:

  • 如果后续我们有遇到在本地开发环境正常,但在docker中却无法使用的工具或运行的程序,比如tcpdump时,不妨直接打开它,以排查是否与能力相关。
  • 如果打开全能力后就能正常使用或运行,则再根据“capabilities(7) — Linux manual page”去找对应的能力选项
  • 最后通过--cap-add来开启必须的能力即可(不推荐大家直接使用--privileged的原因是,不安全)。

0 人点赞