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 ...
随机推荐
- Android 蓝牙开发
今天给大家带来蓝牙开发的基础,主要展示的是程序搜到蓝牙会通过list展示出来,并实时排序,远近与信号强弱 首先我们要有次jar包 watermark/2/text/aHR0cDovL2Jsb2cuY3 ...
- xcode10 改动
xcode10 开发环境 比 之前有了稍微的变动 1. 代码块 界面控件 图片资源等 的查看位置发生了变化 之前的开发环境 代码块 统一放在 右侧栏的下方的几个选项中 现在 统一放到了上方 ...
- (七):处理MFC
(一):简单介绍 为了可以在一个Winelib应用中使用MFC,你须要首先使用Winelib又一次编译MFC. 在理论上,你应该为Windows的MFC编写一个封装(怎样编写在后面介绍).可是,在实践 ...
- Nginx Web服务应用
Nginx 指令目录 Nginx 介绍 Nginx 编译安装 Nginx 功能模块 Nginx 目录结构 Nginx 配置文件 Nginx 虚拟主机配置 Nginx 状态信息功能配置 Nginx 错误 ...
- 如何免费的将本地Web服务映射到外网
链接地址:https://hongmaju.github.io/2018/05/13/ngrok%E5%B0%86%E6%9C%AC%E5%9C%B0Web%E6%9C%8D%E5%8A%A1%E6% ...
- [转]Linux下网络常用命令和工具
转自:http://int32bit.me/2016/05/04/Linux%E5%B8%B8%E7%94%A8%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7%E6%80%B ...
- centos图形界面,vncserver
yum -y groupinstall "Server with GUI" RHEL7 安装图形界面1. 以root角色运行以下命令来安装TigerVNC server yum i ...
- react文档demo实现输入展示搜索结果列表
文档页面地址:https://doc.react-china.org/docs/thinking-in-react.html 该文档只给了具体实现思路,下面是我实现的代码. 初学react,如果有写的 ...
- Java开发面试题汇总整理
又是金三银四的时候,我希望这份面试题能够祝你一臂之力! 自我和项目相关 1.自我介绍 2.你觉得自己的优点是?你觉得自己有啥缺点? 3.你有哪些 offer? 4.你为什么要离开上家公司?你上家公司在 ...
- dhcpsrv:windows系统的优秀开源免费dhcp serve软件
概述: 官方网站 :http://www.dhcpserver.de/ 写博客时的可免费下载版本 2.52, 或者在cnblogs 本地下载 --========================== ...