SIGSEGV: как сопоставить строку ошибки и получить исключение из segfault - PullRequest
0 голосов
/ 28 мая 2020

Я хотел бы знать, как найти класс и место, где произошла ошибка, используя C ++ в ndk.

Я также хотел бы знать, как сохранить работу программы даже после segfault.

У меня есть эта функция, которая отображает ошибку, я не знаю, как ее читать и что означает каждая вещь

void handler(int signum, siginfo_t *info, void* contextPtr)
{
    ucontext* context = (ucontext_t*)contextPtr;

    if(info->si_signo == SIGSEGV)
    {
        Log("SIGSEGV | Fault address: 0x%X", info->si_addr);
        Log("libGTASA base address: 0x%X", g_libGTASA);
        Log("register states:");

        Log("r0: 0x%X, r1: 0x%X, r2: 0x%X, r3: 0x%X", 
            context->uc_mcontext.arm_r0, 
            context->uc_mcontext.arm_r1, 
            context->uc_mcontext.arm_r2,
            context->uc_mcontext.arm_r3);
        Log("r4: 0x%x, r5: 0x%x, r6: 0x%x, r7: 0x%x",
            context->uc_mcontext.arm_r4,
            context->uc_mcontext.arm_r5,
            context->uc_mcontext.arm_r6,
            context->uc_mcontext.arm_r7);
        Log("r8: 0x%x, r9: 0x%x, sl: 0x%x, fp: 0x%x",
            context->uc_mcontext.arm_r8,
            context->uc_mcontext.arm_r9,
            context->uc_mcontext.arm_r10,
            context->uc_mcontext.arm_fp);
        Log("ip: 0x%x, sp: 0x%x, lr: 0x%x, pc: 0x%x",
            context->uc_mcontext.arm_ip,
            context->uc_mcontext.arm_sp,
            context->uc_mcontext.arm_lr,
            context->uc_mcontext.arm_pc);

        Log("backtrace:");
        Log("1: libGTASA.so + 0x%X", context->uc_mcontext.arm_pc - g_libGTASA);
        Log("2: libGTASA.so + 0x%X", context->uc_mcontext.arm_lr - g_libGTASA);

        Log("1: libsamp.so + 0x%X", context->uc_mcontext.arm_pc - FindLibrary("libsamp.so"));
        Log("2: libsamp.so + 0x%X", context->uc_mcontext.arm_lr - FindLibrary("libsamp.so"));

        exit(0);
    }

    return;
}
```

...