了解了应用程序的编译运行原理后,下面看一看gdb能追踪到进程的原理:
gdb运行在应用态,基本用法是gdb ./hello,在gdb程序中拉起了hello程序,hello进程相当于gdb的子进程,gdb是hello进程的父进程。
一)断点的原理
gdb使用b backpoint在可执行文件中加入断点-------------在可执行文件对应的backpoint处,加入了INT3 指令,该指令是触发中断,内核收到此中断后,将当前进程暂停执行,并将中断转为软件信号SIGTRAP,发给hello进程。
子进程被父进程使用ptrace个跟踪后,子进程的信号会被父进程获取,这样gdb获得这个信号后,暂停应用程序,可查看调用栈。
查看调用栈有两种方法:
1)glibc中的backtrace函数,获取当前线程的调用堆栈。
应用程序的SIGSEGV信号,可以自定义捕获,在自定义函数中调用backtrace函数,打印调用栈。
2)直接使用_asm_获得ebp寄存器的值,直接读取。