2

我想知道是否有任何移植可用于 uclibc in arm 的回溯实现,我可以在我的信号处理程序中使用它来调试分段错误。

我确实在这里遇到了一个有用的代码 ,并尝试在我的信号处理程序中使用它,但它在第一次检查时失败并从那里返回。

我还尝试了一个递归回溯函数,它简单地使用 (current_frame_p)-3) 递归,直到它为 NULL 并打印 (current_frame_p)-1)。这似乎也给我带来了问题。我得到的只是处理程序的地址和一些垃圾大地址(我假设它可能是信号地址)。但我不会超越这一点。我希望我的踪迹超越这一点。

崩溃的代码是故意编写的,用于调试取消引用和无效地址。

任何帮助都感激不尽。

非常感谢提前。

-凯沙夫

4

2 回答 2

3

我们在 Arm 设备(但是 glibc)上使用以下代码。几年前我发现了这段代码(不记得具体在哪里)。它工作得很好,没有任何问题。

void __printBacktrace(int skipCount,bool segv=false)
{

int * func_addresses[BACKTRACE_MAXDEPTH];
char demangle_output[1000];
int nfuncs = __arm_backtrace(func_addresses, BACKTRACE_MAXDEPTH );
printf("-----   Start Stack Trace   -----\n");
for (int i = skipCount; i < nfuncs; ++i)
{
    Dl_info info;
    if (dladdr(func_addresses[i], &info))
    {
        int dStat;
        size_t dLength = 1000;
        char * demangled = abi::__cxa_demangle(info.dli_sname,
                demangle_output, &dLength, &dStat);
        if (demangled && !dStat)
        printf(
                "return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n",
                func_addresses[i], info.dli_fname, info.dli_fbase,
                demangled, info.dli_saddr, (int) func_addresses[i]
                - (int) info.dli_saddr);
        else
        printf(
                "return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n",
                func_addresses[i], info.dli_fname, info.dli_fbase,
                info.dli_sname, info.dli_saddr, (int) func_addresses[i]
                - (int) info.dli_saddr);
    } else
    fprintf(fCrash, "return addr: %p\n", func_addresses[i]);
}
printf("-----   End Stack Trace -----\n");


}

int __arm_backtrace(int **arr, int maxsize)

{

    int cnt = 0;
void *fp = __builtin_frame_address(0);
struct layout *lp = (struct layout *) ((char*) fp - 12);
while (cnt < maxsize)
{

    arr[cnt++] = (int *) lp->return_address;
    if (!lp->next)
    {
        break;
    }
    lp = lp->next - 1;
}
return cnt;
}
于 2010-11-08T09:54:42.290 回答
0

我知道这个问题是关于 uclibc 的,但我现在已经找到了如何使用 glibc 进行回溯,所以我想我会说。使用“gcc -funwind-tables -rdynamic”。unwind-tables 选项使 libc:backtrace() 工作,而 dynamic 选项使 libc:backtrace_symbols() 工作。

于 2012-07-04T22:02:43.790 回答