开心happy

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

了解了应用程序的编译运行原理后,下面看一看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寄存器的值,直接读取。

 

posted on 2016-02-01 12:32  开心happy  阅读(449)  评论(0编辑  收藏  举报