linux – uclibc的任何可用的backtrace移植?

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

有没有人有一个很好的解决方案呢?

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

解决方法

更新:

似乎创建了一个patch,以支持x86和ARM(XScale)的uclibc上的backtrace(),它使用__libc_stack_end符号.

原始答案:

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

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;
}

注意:__libc_stack_end符号不再在glibc的更新版本中导出,我不知道它在uclibc中的存在或类似的符号.

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...