科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用Ptrace跟踪进程收到的异常信号

使用Ptrace跟踪进程收到的异常信号

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们在调试程序的时候,程序有时会出现进程收到SIGSEGV信号,异常退出。如果使用GDB,通过拦截该信号,并打印堆栈来实现,但在嵌入式的环境里,需要在嵌入式设备注入gdb server。

作者:korn 来源:赛迪网 2008年6月27日

关键字: 命令行 Linux 技巧

  • 评论
  • 分享微博
  • 分享邮件

也就是说,对于信号的拦截,它是通过标记为trace之后,通过wai的status来判断的。而不是象一般针对系统调用的跟踪。

既然找到了地方,接下来的就很容易了,打印堆栈:

long ebp=0,eip=0,i=0;

struct user_regs_struct regs;

ptrace(PTRACE_GETREGS, pid,NULL,®s);

tprintf("EIP: %lx ----EBP:%lx\n",regs.eip,regs.ebp); //首先获得当前的ebp寄存器中的地址,该地址指向了堆栈中的帧。

ebp = regs.ebp;

eip = regs.eip;

for(;;)

{

i++;

tprintf("%d: eip:%lx ebp:%lx\n",i,eip,ebp);

eip = ptrace(PTRACE_PEEKDATA,pid,ebp+4,NULL); //根据帧的结构,eip的地址在ebp地址+4,将来将其解析成函数,具体的文本就全靠它了。

ebp = ptrace(PTRACE_PEEKDATA,pid,ebp,NULL); //注意前后两行的顺序,这个命令使ebp指向堆栈中的上一个帧

if( 0 == ebp)

break;

}

这样,就能够把堆栈中,各个函数所运行的地址拿到。

你可以使用objdump –D 反编译你所跟踪的进程,来获得其对应的函数。

因为打印堆栈不是在所跟踪的进程内,所以不可以使用backtrace_symbols来对其进行解析,如何将其解析成直观的函数调用,目前我考虑自己实现反汇编来编写,打印出函数的名称。

采用backtrace_symbols有个局限,在编译程序时必须加上-rdynamic才行,按理说通过objdump反编译可以看到,应该更可靠一些。

下一步计划研究可执行文件的反汇编。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章