Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
信号处理器中的arm_pc_C_Arm_Gdb_Interrupt Handling - Fatal编程技术网

信号处理器中的arm_pc

信号处理器中的arm_pc,c,arm,gdb,interrupt-handling,C,Arm,Gdb,Interrupt Handling,尝试在我的信号处理程序中打印错误指令地址,如中所示 出于某种原因,每次我打印p->uc\u mcontext.arm\u pc内容时,我都会得到不同的结果,这对gdb来说没有意义。 如果我用gdb运行相同的程序,并用“信息寄存器”打印寄存器,我会在每次运行时看到一个一致的PC值,这也允许我看到错误代码 信号处理器中的相关代码: static void My_Signals_handler(int sig, siginfo_t *info, void *extra) { ucontext_t *

尝试在我的信号处理程序中打印错误指令地址,如中所示

出于某种原因,每次我打印p->uc\u mcontext.arm\u pc内容时,我都会得到不同的结果,这对gdb来说没有意义。 如果我用gdb运行相同的程序,并用“信息寄存器”打印寄存器,我会在每次运行时看到一个一致的PC值,这也允许我看到错误代码

信号处理器中的相关代码:

static void My_Signals_handler(int sig, siginfo_t *info, void *extra)
{

ucontext_t *p;

printf("Received Signal: %d\n", sig);

switch(sig)
{
case SIGFPE:
case SIGSEGV:
case SIGILL:
case SIGBUS:
    p = (ucontext_t *)extra;
    printf("siginfo address=%x\n", info->si_addr);
    printf("arm_pc address = 0x%X\n", p->uc_mcontext.arm_pc);
    printf("arm_sp address = 0x%X\n", p->uc_mcontext.arm_sp);
    printf("arm_lr address = 0x%X\n", p->uc_mcontext.arm_lr);
    printf("arm_r0  address = 0x%X\n", p->uc_mcontext.arm_r0);
    /* make sure buffer is printed to stodut before we crash */
    fflush(stdout);
    /* restore to default signal handler so core dump is generated from original fault point */
    RegisterForSignals(true);
    return;
    break;
default:
    printf("unknown signal %d\n", sig);
    /* restore to default signal handler so core dump is generated from original fault point */
    RegisterForSignals(true);
    return;
}

return;
}
输出(每次运行时的更改):

当使用gdb运行时

(gdb) info registers                                                  
r0             0x0                 0                                  
r1             0x0                 0                                  
r2             0xffffffff          4294967295                         
r3             0x4bb268            4960872                            
r4             0x494680            4802176                            
r5             0x494ea4            4804260                            
r6             0x0                 0                                  
r7             0x0                 0                                  
r8             0x455               1109                               
r9             0x465               1125                               
r10            0x4946b4            4802228                            
r11            0x4bb168            4960616                            
r12            0x0                 0                                  
sp             0xbefffcc0          0xbefffcc0                         
lr             0x4033ad            4207533                            
pc             0x4033ae            0x4033ae <main(int, char**)+526>   
cpsr           0x40070030          1074200624                         
fpscr          0x0                 0                                  
(gdb) 

                                                            
(gdb)信息寄存器
r0 0x0
r1 0x0 0
r2 0xFFFFFFFF4294967295
r3 0x4bb268 4960872
r4 0x494680 4802176
r5 0x494ea4 4804260
r6 0x0 0
r7 0x0 0
r8 0x455 1109
r9 0x465 1125
r10 0x4946b4 4802228
r11 0x4bb168 4960616
r12 0x0 0
sp 0xBEFFCC0 0xBEFFCC0
lr 0x4033ad 4207533
个人计算机0x4033ae 0x4033ae
cpsr 0x40070030 1074200624
fpscr 0x0 0
(gdb)

好,问题是ASLR将地址随机化。当我禁用ASLR时,arm_pc地址与gdb输出的地址相同。
因为这不是一个永久性的解决方案,所以我使用了回溯API来打印回溯,并用它获得了应用程序开始时的偏移量。该地址可以在gdb中使用。

您不能从信号处理程序调用
printf()
(和朋友)。信号不安全。我同意,我已经删除了指纹并将数据存储在一个全局变量中,另一个线程正在从那里读取数据,但arm_pc仍然错误。
(gdb) info registers                                                  
r0             0x0                 0                                  
r1             0x0                 0                                  
r2             0xffffffff          4294967295                         
r3             0x4bb268            4960872                            
r4             0x494680            4802176                            
r5             0x494ea4            4804260                            
r6             0x0                 0                                  
r7             0x0                 0                                  
r8             0x455               1109                               
r9             0x465               1125                               
r10            0x4946b4            4802228                            
r11            0x4bb168            4960616                            
r12            0x0                 0                                  
sp             0xbefffcc0          0xbefffcc0                         
lr             0x4033ad            4207533                            
pc             0x4033ae            0x4033ae <main(int, char**)+526>   
cpsr           0x40070030          1074200624                         
fpscr          0x0                 0                                  
(gdb)