GDB启动作为参数传入的目标程序的底层实现机制是什么?
GDB直接启动目标程序的实现流程
在Linux环境下,gdb ./my_program的启动流程和attach到运行中进程的核心底层逻辑一致,都依赖ptrace系统调用,仅前置初始化步骤有差异,具体流程如下:
- GDB首先调用
fork()创建一个子进程 - 子进程优先执行
ptrace(PTRACE_TRACEME, 0, NULL, NULL),向内核声明当前进程允许被父进程跟踪 - 子进程后续调用
exec()加载目标程序./my_program,内核在exec执行完成后会自动向子进程发送SIGTRAP信号,触发子进程暂停运行 - GDB作为父进程捕获到子进程的暂停信号后,就获得了子进程的控制权,后续的读内存、设置断点、查看寄存器等所有调试操作,和attach到运行中进程的实现逻辑完全相同,都是通过不同参数的
ptrace调用完成
和主动attach运行中进程的唯一区别是:attach场景下GDB是通过ptrace(PTRACE_ATTACH, 目标PID, ...)主动绑定已运行的进程,而直接启动场景下是子进程主动声明允许被跟踪,不需要调用PTRACE_ATTACH,后续调试逻辑完全复用同一套实现。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

