gdb的基本工作原理是什么?
Oen 通过 Google 阅读器发送给您的内容: gdb的基本工作原理是什么? 于 10-10-28 通过 SpongeLiu的blog 作者:sponge 还是面某M的时候,面试官问我:"用过gdb么?" 答:"用过,调了两年bug了"。"那好,给我解释下gdb是怎么工作的?或者说跟内核什么地方有关系?"。 是阿, gdb凭什么可以调试一个程序?凭什么能够接管一个程序的运行? 我以前也想过这样的问题,但是后来居然忘记去查看了。我想到了我们的二进制翻译器,想到了intel的pin,Dynamo。这些都是将翻译后的代码放到codecache中去运行,然后接管整个程序的执行。gdb是不是也一样呢? 如果真是这样,为什么我记得用gdb跑一个程序,这个程序会有一个单独的进程?gdb的attach功能又是怎么实现的? 想了想,我还是没有答上来。面试就是由这么一个又一个细节的小杯具最后汇集成一个大杯具。 那么,gdb到底是凭什么接管的一个进程的执行呢?其实,很简单, 通过一个系统调用:ptrace 。ptrace系统调用的原型如下: #include <sys/ptrace.h> long ptrace ( enum __ptrace_request request , pid_t pid , void * addr , void * data ) ; 说明:ptrace系统调用提供了一种方法来让父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。(man手册) 其实,说到这里,一切原理层面应该都比较明朗了(且先不去管内核中是怎么实现ptrace的)。gdb就是调用这个系统调用,然后通过一些参数来控制其他进程的执行的。 下面我们来看ptrace函数中request参数的一些主要选项: PTRACE_TRACEME: 表示本进程将被其父进程跟踪,交付给这个进程...