解决docker使用GDB,无法进入断点的问题

解决docker使用GDB,无法进入断点的问题,第1张

解决docker使用GDB,无法进入断点的问题

本文主要介绍如何解决docker在使用GDB时无法进入断点的问题。有很好的参考价值,希望对大家有所帮助。来和边肖一起看看吧。

问题

Gdb在docker中运行,命中了一个断点,但是无法进入断点。

原因

Docker为了保证主机的安全性,docker有很多安全设置,包括ASLR(地址空间布局随机化),即docker中的内存地址与主机中的不同。

ASLR将导致GDB,一个依赖于地址的程序,无法正常工作。

解决方法

使用docker的超级特权和add-privileged(两条水平线,markdown语法

比如:

码头工人运行-特权……

GDB可以正常工作。

超级特权将关闭许多安全设置,因此您可以充分利用docker功能。

比如可以在docker里再打开docker,呵呵。

补充知识:Dockerplace:不允许 *** 作。处理方法

docker中的Gdb在调试流程时会报错:

(gdb)附加30721

附加到进程30721

ptrace:不允许 *** 作。

原因是ptrace被Docker默认禁止。考虑到应用分析的需要,有几种方法可以解决:

1。关闭seccomp

dockerrun-security-optseccomp=unconfined

2。采用超级权限模式

码头运行-特权

3。仅开放ptrace限制

dockerrun-cap-addsys_ptrace

当然,从安全角度来说,如果只是想用gdb进行调试,建议使用第三种。

安全计算模式(seccomp)是一个Linux内核函数,可以用来限制容器中可用的 *** 作。

Docker的默认seccomp配置文件是一个白名单,它指定了允许的调用。

下表列出了由于不在白名单中而被有效阻止的重要(但不是全部)系统调用。此表包含每个系统调用被阻塞的原因。

系统调用 描述 acct Accountingsyscall可以让容器禁用自己的资源限制或进程记帐。也由CAP_SYS_PACCT选通。 add_key 防止容器使用没有命名空间的内核密匙环。 adjtimex 与clock_settime和settimeofday类似,时间/日期没有命名空间。也由CAP_SYS_TIME门控。 bpf 拒绝将潜在的持久bpf程序加载到内核中,该程序已经被CAP_SYS_ADMIN控制。 clock_adjtime 时间/日期没有命名空间。也由CAP_SYS_TIME门控。 clock_settime 时间/日期没有命名空间。也由CAP_SYS_TIME门控。 clone 拒绝克隆新的命名空间。除CLONE_USERNS外,CLONE_*标志也由CAP_SYS_ADMIN选通。 create_module 拒绝内核模块上的 *** 作和功能。过时了。也由CAP_SYS_MODULE选通。 delete_module 拒绝内核模块上的 *** 作和功能。也由CAP_SYS_MODULE选通。 finit_module 拒绝内核模块上的 *** 作和功能。也由CAP_SYS_MODULE选通。 get_kernel_syms 拒绝检索导出的内核和模块符号。过时了。 修改内核内存和NUMA设置的get_mempolicy Syscall。已经由CAP_SYS_NICE门控。 init_module 拒绝内核模块上的 *** 作和功能。也由CAP_SYS_MODULE选通。 ioperm 防止容器修改内核I/O特权级别。已经由CAP_SYS_RAWIO门控。 iopl 防止容器修改内核I/O特权级别。已经由CAP_SYS_RAWIO门控。 kcmp 限制进程检查功能,已被删除CAP_PTRACE阻止。 kexec_file_load kexec_load的姊妹系统调用,做同样的事情,只是参数略有不同。也由CAP_SYS_BOOT选通。 kexec_load 拒绝为以后的执行加载新的内核。也由CAP_SYS_BOOT选通。 keyctl 阻止容器使用内核密匙环,它没有命名空间。 lookup_dcookie Tracing/profilingsyscall,这可能会泄漏主机上的大量信息。也由CAP_SYS_ADMIN门控。 mbind Syscall修改内核内存和NUMA设置。已经由CAP_SYS_NICE门控。 mount 拒绝装载,已由CAP_SYS_ADMIN控制。 move_pages 修改内核内存和NUMA设置的系统调用。 name_to_handle_at 姊妹系统调用open_by_handle_at。已经由CAP_SYS_NICE门控。 nfsservctl 拒绝与内核nfs守护进程进行交互。从Linux3.1开始过时。 open_by_handle_at 旧集装箱漏装原因。也由CAP_DAC_READ_SEARCH选通。 perf_event_open 跟踪/分析syscall,这可能会泄漏主机上的大量信息。 personality 阻止容器启用BSD仿真。本质上并不危险,但是测试不充分,可能会有很多内核漏洞。 pivot_root Denypivot_root,应该是特权 *** 作。 process_vm_readv 限制进程检查功能,已被删除CAP_PTRACE阻塞。 process_vm_writev 限制进程检查功能,已被删除CAP_PTRACE阻止。 ptrace 跟踪/分析syscall,这可能会泄漏主机上的大量信息。已被删除CAP_PTRACE阻止。 query_module 拒绝内核模块上的 *** 作和功能。过时了。 quotactl Quotasyscall可以让容器禁用它们自己的资源限制或进程记帐。也由CAP_SYS_ADMIN门控。 重新启动 不要让容器重新启动主机。也由CAP_SYS_BOOT选通。 request_key 阻止容器使用没有命名空间的内核密匙环。 set_mempolicy 修改内核内存和NUMA设置的Syscall。已经由CAP_SYS_NICE门控。 setns 拒绝将线程与命名空间相关联。也由CAP_SYS_ADMIN门控。 settimeofday 时间/日期没有命名空间。也由CAP_SYS_TIME门控。 socket,socketcall 用于发送或接收数据包以及其他套接字 *** 作。除了通信域AF_UNIX、AF_INET、AF_INET6、AF_NETLINK和AF_PACKET之外,所有socket和socketcall调用都被阻塞。 stime 时间/日期没有命名空间。也由CAP_SYS_TIME门控。 swapon 拒绝开始/停止交换到文件/设备。也由CAP_SYS_ADMIN门控。 swapoff 拒绝开始/停止交换到文件/设备。也由CAP_SYS_ADMIN门控。 sysfs 过时的syscall。 _sysctl 已过时,替换为/proc/sys。 umount 应该是特权 *** 作。也由CAP_SYS_ADMIN门控。 umount2 应该是特权 *** 作。也由CAP_SYS_ADMIN门控。 unshare 拒绝为进程克隆新的命名空间。也由CAP_SYS_ADMIN控制,但非共享用户除外。 uselib 与共享库相关的较旧的syscall,长时间未使用。 userfaultfd 用户空间页面错误处理,主要用于进程迁移。 ustat 过时的系统调用。 内核x86实模式虚拟机中的vm86 。也由CAP_SYS_ADMIN门控。 内核x86实模式虚拟机中的vm86old 。也由CAP_SYS_ADMIN门控。

以上docker使用GDB无法进入断点的问题是边肖分享的全部内容。希望给大家一个参考,多多支持我们。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/774161.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存