我们在ARM 9上运行uclibc linux。问题是uclibc不支持回溯。 发生核心转储时,我无法获取调用堆栈。
例如,现有的uclibc回溯移植,或者在发生核心转储时抓取调用堆栈的好方法(uclibc + ARM + Linux)?
QEMU是否适合在ARM和PowerPC的汇编程序中学习编程?
OpenCV Cmake无法findffmpeg库
无法打开RaspBerry Pi上的共享库(so)
mprotect在ARM Linux上刷新指令caching吗?
ARM安全模式中的分区检查程序是什么?
交叉编译时如何使用外部库?
如何使用软件工具将数据发送到Zynq的AXI-Stream?
ARM Linux内核驱动程序中的关键时序
安全模式可以访问安全/非安全的内存如何?
“(gdb)在qemu仿真arm架构上运行可执行文件时运行”崩溃
更新:
似乎创建了一个补丁来支持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中是否存在它或类似的符号。
看看在这里问同样的问题:
http://lists.uclibc.org/pipermail/uclibc/2010-June/044115.html
从这里提到一个补丁:
http://git.stlinux.com/?p=stm/uclibc.git;a=commit;h=d6a3d9ece5922a337800a8e2ed4db7e226f9ccb3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。