ARM 使用 backtrace 调测 SIGSEGV 信号 ---- 打印寄存器值

static void ac_sigsegv_handler(int sig, siginfo_t *info, void *ctx)
{
    ucontext_t *context = (ucontext_t *)ctx;
    int i = 0;

    /* dump registers, ARM CPU specific */
    XAG_LOG_E( "Signal = %d  Memory location = %p\n"
            "R0 = %016X  R1 = %016X  R2 = %016X\n"
            "R3 = %016X  R4 = %016X  R5 = %016X\n"
            "R6 = %016X  R7 = %016X\n"
            "R8 = %016X  R9 = %016X  R10 = %016X\n"
            "FP = %016X  IP = %016X  SP = %016X\n"
            "LR = %016X  PC = %016X \n\n",
            sig, info->si_addr,
            context->uc_mcontext.arm_r0,
            context->uc_mcontext.arm_r1,
            context->uc_mcontext.arm_r2,
            context->uc_mcontext.arm_r3,
            context->uc_mcontext.arm_r4,
            context->uc_mcontext.arm_r5,
            context->uc_mcontext.arm_r6,
            context->uc_mcontext.arm_r7,
            context->uc_mcontext.arm_r8,
            context->uc_mcontext.arm_r9,
            context->uc_mcontext.arm_r10,
            context->uc_mcontext.arm_fp,
            context->uc_mcontext.arm_ip,
            context->uc_mcontext.arm_sp,
            context->uc_mcontext.arm_lr,
            context->uc_mcontext.arm_pc);

    /* get call stack and write to stdout */
    void *buf[256] = {0};
    int n = backtrace(buf, 256);
    XAG_LOG_E("backtrace() returned %d addresses", n);
 
    char **symbols = backtrace_symbols(buf, n);
    if(NULL == symbols){
        XAG_LOG_E("backtrace symbols");
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < n; i++) {
        XAG_LOG_E("%d: %s\n", i, symbols[i]);
    }
 
    free(symbols);
}

void test_3(int *p)
{
    *p = 1;
}

void test_2(int *p)
{
    test_3(p);
}

void test_1(int *p)
{
    test_2(p);
}

void main(XAG_S32 argc, XAG_CHAR** argv)
{
    int *p = (int *)0x12345678;

    /* SIGSEGV */
    struct sigaction action;
    sigemptyset(&action.sa_mask);
    action.sa_sigaction = ac_sigsegv_handler;
    action.sa_flags = SA_SIGINFO;
    sigaction(SIGSEGV, &action, NULL);

    test_1(p);

}

#if 0

  15fe68:    b480          push    {r7}
  15fe6a:    b083          sub    sp, #12
  15fe6c:    af00          add    r7, sp, #0
  15fe6e:    6078          str    r0, [r7, #4]
  15fe70:    687b          ldr    r3, [r7, #4]
  15fe72:    2201          movs    r2, #1
  15fe74:    601a          str    r2, [r3, #0]        // 由R15(PC)寄存器来判断此处触发 SIGSEGV 信号
  15fe76:    bf00          nop
  15fe78:    370c          adds    r7, #12
  15fe7a:    46bd          mov    sp, r7
  15fe7c:    f85d 7b04     ldr.w    r7, [sp], #4
  15fe80:    4770          bx    lr

[ac_sigsegv_handler ] Signal = 11  Memory location = 0x12345678
R0 = 0000000012345678  R1 = 000000007EA189F8  R2 = 0000000000000001
R3 = 0000000012345678  R4 = 000000007EA18CA8  R5 = 0000000000000000
R6 = 0000000000000000  R7 = 000000007EA18AF8
R8  = 0000000000000000  R9  = 0000000000000000  R10 = 0000000076F41000
FP = 0000000000000000  IP = 00000000000000AE  SP = 000000007EA18AF8
LR = 000000000015FE91 
PC = 000000000015FE74

[ac_sigsegv_handler ] backtrace() returned 2 addresses
[ac_sigsegv_handler ] 0: ./sc2000_app() [0x15f82a]                       //
backtrace
[ac_sigsegv_handler ] 1: /lib/libc.so.6(+0x25030) [0x76c6a030]     // __default_rt_sa_restorer

#endif

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-11 01:30:06       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-11 01:30:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-11 01:30:06       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-11 01:30:06       20 阅读

热门阅读

  1. SCAU 动态规划算法

    2024-05-11 01:30:06       10 阅读
  2. MyBatis中if判断(踩坑)

    2024-05-11 01:30:06       9 阅读
  3. Android应用开发-回声消除AEC

    2024-05-11 01:30:06       10 阅读
  4. 设计模式——迭代器模式(Iterator)

    2024-05-11 01:30:06       8 阅读
  5. MySQL环境搭建

    2024-05-11 01:30:06       8 阅读
  6. 产业链图谱在优化供应链管理中的作用

    2024-05-11 01:30:06       9 阅读
  7. Channel实现Flutter与原生平台之间的双向通信

    2024-05-11 01:30:06       9 阅读
  8. 达梦数据库常用命令整理

    2024-05-11 01:30:06       6 阅读
  9. Android 11.0 mtk平台系统添加公共so库的配置方法

    2024-05-11 01:30:06       10 阅读
  10. VUE中可适化大屏的自适应

    2024-05-11 01:30:06       7 阅读