The way to unwind the stack on Linux EABI
I. probe the stack frame structure The original idea is to unwind the function call stack according to a determined prologue on the begin of a frame. For example:
-------
PC
-------
LR
-------
SP
-------
FP
-------
.......
The precondition of this idea is that every frame stores all these infomations in same order at the front of the frame. But the practices tell us that's not true. In fact, some functions do so, some not. Why do some functions not do so? (Not understand till now. Maybe in order to save some memery, maybe it is not necessary to do so, maybe other unknown reasons.)
To prove this jugement, we did following things.
1. The output call stack is not complete with the method refered above.
2. Produce coredump file, then analyze the frame structures with gdb. We found three strange things:
1st, the caller frame of the frame before the signal process frame is itself, so we can't unwind to inner frame.
2nd, in stack memery we can't find any frame address showed by "info frame" command. How so?
3rd, then we dissamble different frames, we were astonished to found that different functions push very different registers to the stack, even some functions didn't push any register at all.
3. Finally, we found an offical hint on gdb web site: "whether each function has a frame pointer and if not".
II. Try with backtrace of glibc. Since there is not a determined frame structure, can the backtrace function of glibc work? We did a lot of tries. But the results are the same with the above method. We are so wondering. So we read the source code of backtrace function of glibc-linaro. The answer is it use the same method we did before. So the results are same.
III. Try with unwind library first time. Search on google and baidu. We found a library unwind. It's the library to unwind function call stack. And we integrated it in our project immedially. Soon we got the result. It only has one frame more than the backtrace function, and there is some other unkown error messages. It seems not suit to our project still. We guess, maybe our project is more complicated than libunwind can apply, because we have 64bit CPU and OS, but 32bit application. Or maybe it's not suitable for EABI.
IV. Try to learn from GDB. Hitherto, the only one practicable method is GDB, why not to find the method that GDB use? Factually, She gong and I had tried to read GDB's code before. But had to terminate for it's too complicated and too big to understand in a short time. This time, we returned to it again. Though we didn't understand how it unwind the stack still, we found some usefull infomations. 1. GDB use ptrace to get the registers. 2. GDB try to parse the function prologues when there isn't frame pointer. But how and what's the criteria, we didn't know still.
V. Try with unwind library second time. During we try to understand GDB's unwinding method. We found a usefull infomation that .eh_frame or .ARM.exidx or .ARM.extab section in elf file can help to unwind the stack. This inspired a sparkle: can we unwind stack only with these section? We tried to find a way and found the attachment document. It introduced these sections and the compile paramter "-funwind-tables" and the related libunwind. So we try according it. It works!
[References]:
https://wiki.linaro.org/KenWerner/Sandbox/libunwind?action=AttachFile&do=get&target=libunwind-LDS.pdf
https://sourceware.org/gdb/papers/unwind.html
https://www.airs.com/blog/archives/460
https://www.facebook.com/notes/scott-tsai/%E5%9C%A8%E6%B2%92%E6%9C%89-frame-pointer-%E7%9A%84%E6%83%85%E6%B3%81%E4%B8%8B%E9%80%B2%E8%A1%8C-stack-unwind/784226238316104/
[A sparkle]:
Can we use _Unwind_Backtrace() of ligcc_s.so to unwind the function stack?
The way to unwind the stack on Linux EABI的更多相关文章
- Extended TCP/IP Stack In Linux: Netfilter Hooks and IP Table
https://www.amazon.com/gp/product/1118887735 The chapter about debugging is rather outdated - it des ...
- Linux常用获取进程占用资源情况手段
测试环境:Ubuntu14.04 1. 获取进程ID号 ps -aux | grep your_process_name 例如: xxx@xxx:~$ ps -e |grep Midlet|awk ...
- Coping with the TCP TIME-WAIT state on busy Linux servers
Coping with the TCP TIME-WAIT state on busy Linux servers 文章源自于:https://vincent.bernat.im/en/blog/20 ...
- Linux: 20 Iptables Examples For New SysAdmins
Linux comes with a host based firewall called Netfilter. According to the official project site: net ...
- linux 内核参数图解
https://www.suse.com/documentation/sles11/book_sle_tuning/data/part_tuning_kernel.html http://blog.c ...
- Error handling in Swift does not involve stack unwinding. What does it mean?
Stack unwinding is just the process of navigating up the stack looking for the handler. Wikipedia su ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- android 官方文档 JNI TIPS
文章地址 http://developer.android.com/training/articles/perf-jni.html JNI Tips JNI is the Java Native I ...
- NDK(5) Android JNI官方综合教程[JavaVM and JNIEnv,Threads ,jclass, jmethodID, and jfieldID,UTF-8 and UTF-16 Strings,Exceptions,Native Libraries等等]
JNI Tips In this document JavaVM and JNIEnv Threads jclass, jmethodID, and jfieldID Local and Global ...
随机推荐
- intellj idea 跑覆盖率
- PHP异步扩展Swoole笔记(1)
安装Swoole扩展 通过pecl安装, 系统中最好已经有http2依赖, 如果是Ubuntu, 可以直接通过apt安装nghttp2, 如果是Centos或者需要自己编译, 在Github下载ngh ...
- IDEA使用笔记(十一)——好玩的类图结构
今天使用 IntelliJ IDEA 发现一个好玩的操作,尤其对于研究源码了解类的层级关系有非常大的帮助! 1:先看效果 1-1:HashSet的类图结构——继承什么类.实现什么接口一目了然 1-2: ...
- springboot nginx 配置
安装nginx参考本人另一篇博客:http://www.cnblogs.com/gmq-sh/p/5750833.html spring-boot需要启动nginx的,用于监听启动的端口.一.配置ng ...
- Effective Java 第三版——63. 注意字符串连接的性能
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- celery --分布式任务队列
一.介绍 celery是一个基于python开发的分布式异步消息任务队列,用于处理大量消息,同时为操作提供维护此类系统所需的工具. 它是一个任务队列,专注于实时处理,同时还支持任务调度.如果你的业务场 ...
- [druid]大数据挑战——如何使用Druid实现数据聚合
-- 知道你为什么惧组件很多的一些开源软件? 因为缺乏阅读能力. 最近我接手了druid+kafka+elk一套等日志系统. 但是我对druid很陌生, 周旋了几天, 官网文档快速开始照着做了下. 看 ...
- 从零开始搭建FAQ引擎--基于ES的字面匹配
从零开始搭建FAQ引擎--基于ES的字面匹配
- java生成兑换码礼包码--工具类
import java.util.HashSet; import java.util.Random; import java.util.Set; public class GenSerial { pr ...
- netMarketing类库: 类库说明
这个类库是作者工作中使用的私人类库,本类库适用于自动化行业的软件工程师使用.如果大家在使用中有任何疑问和建议欢迎联系作者, 或者在页面留言. (一) 引用类库 本类库的环境为.net framewor ...