Native下如何获取调用栈?
simsun
该思维导图由 AI 生成,仅供参考
你好,我是 simsun,曾在微信从事 Android 开发,也是开源爱好者、Rust 语言“铁粉”。应绍文邀请,很高兴可以在“高手课”里和你分享一些编译方面的底层知识。
当我们在调试 Native 崩溃或者在做 profiling 的时候是十分依赖 backtrace 的,高质量的 backtrace 可以大大减少我们修复崩溃的时间。但你是否了解系统是如何生成 backtrace 的呢?今天我们就来探索一下 backtrace 背后的故事。
下面是一个常见的 Native 崩溃。通常崩溃本身并没有任何 backtrace 信息,可以直接获得的就是当前寄存器的值,但显然 backtrace 才是能够帮助我们修复 Bug 的关键。
在阅读后面的内容之前,你可以先给自己 2 分钟时间,思考一下系统是如何生成 backtrace 的呢?我们通常把生成 backtrace 的过程叫作 unwind,unwind 看似和我们平时开发并没有什么关系,但其实很多功能都是依赖 unwind 的。举个例子,比如你要绘制火焰图或者是在崩溃发生时得到 backtrace,都需要依赖 unwind。
书本中的 unwind
1. 函数调用过程
如果你在大学时期修过汇编原理这门课程,相信你会对下面的内容还有印象。下图就是一个非常标准的函数调用的过程。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了在Native开发中获取调用栈的原理和方法。首先,作者强调了在调试Native崩溃或进行profiling时,backtrace的重要性,并展示了一个常见的Native崩溃的示例。接着,文章详细讲解了函数调用过程和恢复调用帧的原理,以及在ARM体系结构中进行unwind的方法。在Android中,作者分别讨论了Debug版本和Release版本的unwind方法,并介绍了“.eh_frame”段落的构成和作用。最后,文章总结了unwind的难点和解决方法,以及在生产环境中可能遇到的栈破坏情况。整体来说,本文对于从事Native开发或对底层技术感兴趣的读者具有很高的参考价值。读者可以通过本文了解到在Native开发中获取调用栈的原理和方法,为他们在调试和优化Native应用程序提供了重要的技术支持。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》,新⼈⾸单¥59
《Android 开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- 山鬼春节依然继续学习。之前老师讲崩溃优化的时候尝试对native的崩溃进行了捕获,使用的系统提供的uwind工具,当时觉得比较难得在于打印出对应的java堆栈。现在对uwind的原理又了解了一下,但感觉这篇教程的信息量少了些。
作者回复: 👍🏻,获得java堆栈的方法可以参考卡顿补充篇的做法
2019-02-033 - Geek_Yasin28请问这里的方法可以用于获取非崩溃情况下其他线程的native堆栈吗? 对于卡顿的分析,除了Simpleperf ,如果想或许线上的native执行情况,是否只能对指定的函数进行GOTHOOK?
作者回复: 可以的,类似breakpad通过信号量和unwind就可以了
2019-03-282
收起评论