Linux信号处理。如何得到中断指令的地址?

Linux信号处理。如何得到中断指令的地址?,第1张

概述Linux信号处理。 如何得到中断指令地址

有什么方法可以找出机器指令的地址,这是由一些信号中断? 假设我们处于由sigaction()build立的处理程序,并且具有对传递的siginfo_t和ucontext_t所有访问权限。 据我看到,手册没有提到这一点。

发送信号到后台进程

C ++,linux,fork,execvp,waitpID和SIGTSP

如何将信号名称(string)转换为信号代码?

SEH等价于linux或我如何处理 *** 作系统信号(如SIGSERV),但仍然继续

信号SIGFPE问题

不便携式。 但是这是为x86_64:

结构体ucontext_t包含寄存器REG_RIP的值,它应该包含你所寻找的值。 这是第一条指令,从sighandler返回后将被执行。

其他体系结构应该具有类似的寄存器(x86_32上的EIP等)。

让我们看看下面的例子为linux和x86 architure

#include<stdio.h> #define __USE_GNU #include<signal.h> #include<ucontext.h> voID myhandle(int mysignal,siginfo_t *si,voID* arg) { ucontext_t *context = (ucontext_t *)arg; printf("Address from where crash happen is %x n",context->uc_mcontext.gregs[REG_RIP]); context->uc_mcontext.gregs[REG_RIP] = context->uc_mcontext.gregs[REG_RIP] + 0x04 ; } int main(int argc,char *argv[]) { struct sigaction action; action.sa_sigaction = &myhandle; action.sa_flags = SA_SIGINFO; sigaction(11,&action,NulL); printf("Before segfaultn"); int *a=NulL; int b; b =*a; // Here crash will hapen printf("I am still aliven"); return 0; }

现在编译并运行,看看discompiled instrustion集。

jeegar@jeegar:~/stackoverflow$ gcc -g test1.c -o test1.o jeegar@jeegar:~/stackoverflow$ ./test1.o Before segfault Signal is 11 Address from where crash happen is 40065b I am still alive jeegar@jeegar:~/stackoverflow$ objdump -S test1.o

这里在对象转储

printf("Before segfaultn"); 400645: bf a8 07 40 00 mov $0x4007a8,%edi 40064a: e8 21 fe ff ff callq 400470 <puts@plt> int *a=NulL; 40064f: 48 c7 45 f0 00 00 00 movq $0x0,-0x10(%rbp) 400656: 00 int b; b =*a; // Here crash will hapen 400657: 48 8b 45 f0 mov -0x10(%rbp),%rax 40065b: 8b 00 mov (%rax),%eax 40065d: 89 45 fc mov %eax,-0x4(%rbp) printf("I am still aliven"); 400660: bf b8 07 40 00 mov $0x4007b8,%edi 400665: e8 06 fe ff ff callq 400470 <puts@plt>

在40065b地址哪台机器代码在那里,你的代码的哪一行已经完成了。

在这里,我已经给你和示例代码,在发生分割和系统的Seg故障信号一个处理程序将被调用,在那里我已经取得了最后一个执行机器周期的地址,并打印该地址。 为了使地址变化,我还显示了该代码的对象转储和分割线条的机器指令匹配。

我想这是你想要的。

总结

以上是内存溢出为你收集整理的Linux信号处理。 如何得到中断指令的地址?全部内容,希望文章能够帮你解决Linux信号处理。 如何得到中断指令的地址?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1278993.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存