gpt4 book ai didi

linux - 任何可用于 uclibc 的 backtrace 的移植?

转载 作者:IT王子 更新时间:2023-10-29 00:07:19 52 4
gpt4 key购买 nike

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

有人对此有好的解决方案吗?

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

最佳答案

更新:

似乎是 patch 的创建是为了在 x86 和 ARM (XScale) 的 uclibc 上支持 backtrace(),它使用了 __libc_stack_end 符号。


原答案:

我在一个项目中使用的 glibc 版本没有为我们的 ARM 处理器提供功能性 backtrace(),因此我们在 glibc 之外使用 __libc_stack_end 开发了我们自己的 符号。下面是结果代码。或许您可以使用它来编写一个 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 中是否存在类似符号。

关于linux - 任何可用于 uclibc 的 backtrace 的移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2536021/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com