linux – uclibc的任何可用的backtrace移植?
发布时间:2020-05-23 06:03:14 所属栏目:Linux 来源:互联网
导读:我们在ARM 9上运行uclibc linux.问题是uclibc不支持回溯.当核心转储发生时,我无法抓取调用堆栈. 有没有人有一个很好的解决方案呢? 例如,uclibc的回溯的现有移植,或者是在核心转储发生时抓住调用堆栈的好方法(uclibc ARM Linux)? 更新: 似乎创建了一个patch
|
我们在ARM 9上运行uclibc linux.问题是uclibc不支持回溯.当核心转储发生时,我无法抓取调用堆栈. 有没有人有一个很好的解决方案呢? 例如,uclibc的回溯的现有移植,或者是在核心转储发生时抓住调用堆栈的好方法(uclibc ARM Linux)? 解决方法更新:似乎创建了一个patch,以支持x86和ARM(XScale)的uclibc上的backtrace(),它使用__libc_stack_end符号. 原始答案: 我在一个项目中,我们使用的glibc版本没有为我们的ARM处理器提供功能性的backtrace(),所以我们使用__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->lrn");
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中的存在或类似的符号. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
