首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可用于uclibc的回溯移植?

是否有可用于uclibc的回溯移植?
EN

Stack Overflow用户
提问于 2010-03-29 13:57:20
回答 2查看 6.6K关注 0票数 10

我们在ARM9上运行uclibc linux,问题是uclibc不支持回溯。当发生核心转储时,我无法获取调用堆栈。

有没有人有好的解决方案?

例如,现有的uclibc回溯移植,或者在核心转储发生时抓取调用堆栈的好方法(uclibc+ARM+Linux)?

EN

回答 2

Stack Overflow用户

发布于 2010-03-29 14:32:35

更新:

似乎创建了一个来支持x86和ARM (XScale)的uclibc上的backtrace(),并且它使用了__libc_stack_end符号。

原始答案:

我参与的一个项目中,我们使用的glibc版本没有为我们的ARM处理器提供功能性backtrace(),所以我们使用__libc_stack_end符号在glibc外部开发了自己的符号。下面是生成的代码。也许你可以用它来写一个uclibc backtrace()函数。

代码语言:javascript
复制
extern void * __libc_stack_end;

struct backtrace_frame_t
{
    void * fp;
    void * sp;
    void * lr;
    void * pc;
};

int backtrace(void ** array, int size)
{
    void * top_frame_p;
    void * current_frame_p;
    struct backtrace_frame_t * frame_p;
    int frame_count;

    top_frame_p = __builtin_frame_address(0);
    current_frame_p = top_frame_p;
    frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
    frame_count = 0;

    if (__builtin_return_address(0) != frame_p->lr)
    {
        fprintf(stderr, "backtrace error: __builtin_return_address(0) != frame_p->lr\n");
        return frame_count;
    }

    if (current_frame_p != NULL
        && current_frame_p > (void*)&frame_count
        && current_frame_p < __libc_stack_end)
    {
        while (frame_count < size
               && current_frame_p != NULL
               && current_frame_p > (void*)&frame_count
               && current_frame_p < __libc_stack_end)
        {
            frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
            array[frame_count] = frame_p->lr;
            frame_count++;
            current_frame_p = frame_p->fp;
        }
    }

    return frame_count;
}

注意:在较新版本的glibc中不再导出__libc_stack_end符号,我不确定uclibc中是否存在该符号或类似的符号。

票数 5
EN

Stack Overflow用户

发布于 2010-11-11 21:55:47

看一下这里问的同样的问题:

http://lists.uclibc.org/pipermail/uclibc/2010-June/044115.html

其中提到了这里的一个补丁:

http://git.stlinux.com/?p=stm/uclibc.git;a=commit;h=d6a3d9ece5922a337800a8e2ed4db7e226f9ccb3

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2536021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档