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的更多相关文章

  1. 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 ...

  2. Linux常用获取进程占用资源情况手段

    测试环境:Ubuntu14.04 1.  获取进程ID号 ps -aux | grep your_process_name 例如: xxx@xxx:~$ ps -e |grep Midlet|awk ...

  3. 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 ...

  4. Linux: 20 Iptables Examples For New SysAdmins

    Linux comes with a host based firewall called Netfilter. According to the official project site: net ...

  5. linux 内核参数图解

    https://www.suse.com/documentation/sles11/book_sle_tuning/data/part_tuning_kernel.html http://blog.c ...

  6. 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 ...

  7. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  8. android 官方文档 JNI TIPS

    文章地址  http://developer.android.com/training/articles/perf-jni.html JNI Tips JNI is the Java Native I ...

  9. 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 ...

随机推荐

  1. exception The valid characters are defined in RFC 7230 and RFC 3986

      1.情景展示 当你使用浏览器进行问号传参与后台进行交互时,会报这个异常. tomcat控制台报错信息如下: The valid characters are defined in RFC 7230 ...

  2. CodeForces - 344E Read Time (模拟题 + 二分法)

    E. Read Time time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  3. 【转载】Linux下查看CPU、内存占用率

    不错的文章(linux系统性能监控--CPU利用率):https://blog.csdn.net/ctthuangcheng/article/details/52795477 在linux的系统维护中 ...

  4. GUI编程及文件对话框的使用

    import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import ...

  5. 织梦dedecms安全设置详情

    第一.安装的时候数据库的表前缀,最好改一下,不用dedecms默认的前缀dede_,可以改成ljs_,随便一个名称即可. 第二.后台登录开启验证码功能,将默认管理员admin删除,改成一个自己专用的, ...

  6. Navicat 提示 Access violation at address ***(如004ECCF4) in module ‘navicat.exe’. Read of address ***(如00000048)

    Navicat 提示 Access violation at address ***(如004ECCF4) in module ‘navicat.exe’. Read of address ***(如 ...

  7. Java源码阅读的真实体会(一种学习思路)

    Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈 ...

  8. 通过灰度线性映射增强图像对比度实现PS中的色阶

    通过灰度线性映射增强图像对比度 Halcon中如何通过灰度线性映射增强图片对比度呢?不急,我先讲点其他的. 如果你用过Photoshop,那么想必对增强图像的对比度很熟悉.在Photoshop中,我们 ...

  9. MySql快速插入以及批量更新

    MySql快速插入以及批量更新 插入: MySql提供了可以一次插入多条数据的用法: [sql] INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6), ...

  10. Linux 环境变量_006

    ***Linux 环境变量指系统运行程序或命令的能快速找到其位置等其它功能,不用输入复杂命令.以$PATH环境变量为例子, $PATH决定了shell指定寻找命令或程序的路径,比较执行ls命令,如果没 ...