linux信号调试,将信号用作 Linux 调试工具(三)

#include

#include

#include

#include

static void myhandler (unsigned int sn , siginfo_t si ,\

struct ucontext *sc)

{

unsigned int mnip;

int i,j;

printf(" Signal number = %d, Signal errno = %d\n"

,si.si_signo,si.si_errno);

switch(si.si_code)

{

case 1: printf(" SI code = %d (Illegal opcode)\n",si.si_code);

break;

case 2: printf(" SI code = %d (Illegal operand)\n",si.si_code);

break;

case 3: printf(" SI code = %d (Illegal addressing mode)\n",

si.si_code);

break;

case 4: printf(" SI code = %d (Illegal trap)\n",si.si_code);

break;

case 5: printf(" SI code = %d (Privileged opcode)\n",si.si_code);

break;

case 6: printf(" SI code = %d (Privileged register)\n",si.si_code);

break;

case 7: printf(" SI code = %d (Coprocessor error)\n",si.si_code);

break;

case 8: printf(" SI code = %d (Internal stack error)\n",si.si_code);

break;

default: printf("SI code = %d (Unknown SI Code)\n",si.si_code);

break;

}

printf(" Machine State Register = %x \n",

(((struct pt_regs *)((&(sc->uc_mcontext))->regs))->msr));

printf(" Link register pointing to location = 0x%x, \

Opcode at the location = 0x%x \n",

(((struct pt_regs *)((&(sc->uc_mcontext))->regs))->link),

*(unsigned int *) \

(((struct pt_regs *)((&(sc->uc_mcontext))->regs))->link));

for(i=20,j=5;i>0;i-=4,j--)

printf(" Op-Code [nip - %d] = 0x%x at address = 0x%x \n"

,j,*(unsigned int *)(si.si_addr - i)

,(si.si_addr - i) );

printf(" Failed Op-code = 0x%x at address = 0x%x \n",

*(unsigned int*)(si.si_addr), (si.si_addr));

printf(" Op-Code [nip + 1] = 0x%x at address = 0x%x \n",

*(unsigned int *)(si.si_addr + 4), (si.si_addr + 4));

(((struct pt_regs *)((&(sc->uc_mcontext))->regs))->nip) += 4;

}

my()

{

__asm__ volatile ("add 4,5,6 \n\t":);

__asm__ volatile ("add 7,8,9 \n\t":);

__asm__ volatile ("mfmsr 3 \n\t":);

__asm__ volatile ("add 4,5,6 \n\t":);

__asm__ volatile ("add 7,8,9 \n\t":);

}

main()

{

struct sigaction s;

s.sa_flags = SA_SIGINFO;

s.sa_sigaction = (void *)myhandler;

if(sigaction (SIGILL,&s,(struct sigaction *)NULL)) {

printf("Sigaction returned error = %d\n", errno);

exit(0);

}

my();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值