如何定位错误,上传了mapping为什么还有Unknown Source及混淆后 bug如何显示行号
2016-06-07 17:35
260 查看
经常有人发邮件问我们一些很奇怪的问题,还会附上一段堆栈代码:
为什么友盟统计到的错误堆栈都变成 a.b.c 这样的不可读字符了? 为什么上传了 mapping文件之后还会出现(Unknown Source)?
11-11 09:36:42.262: E/AndroidRuntime(2065): Caused by: java.lang.ArithmeticException: divide by zero11-11 09:36:42.262: E/AndroidRuntime(2065): at com.example.hellobigworld.a.b(Unknown Source)
11-11 09:36:42.262: E/AndroidRuntime(2065): at com.example.hellobigworld.a.a(Unknown Source)
11-11 09:36:42.262: E/AndroidRuntime(2065): at com.example.hellobigworld.MainActivity.onClick(Unknown Source)
11-11 09:36:42.262: E/AndroidRuntime(2065): ... 14 more
变成这样的原因是代码被混淆了。ADT的某个版本之后Android自动生成的工程(Eclipse工程)在导出APK的时候都会 混淆代码,混淆之后会发现工程根目录下面多了一个文件夹proguard 里面包含四个文件:
dump.txt 存储class文件的内部结构
mapping.txt 源码到混淆之后代码的映射信息
seeds.txt 被各种 -keep 选项保留的类和成员变量信息
usage.txt 保存 unused or dead code 的信息
如果需要恢复原来的代码,需要用Proguard提供的retrace工具
D:\Tools\proguard4.10\bin>retrace mapping.txt log.txt
Caused by: java.lang.ArithmeticException: divide by zero
at com.example.hellobigworld.ErrFactory.makeException(Unknown Source)
at com.example.hellobigworld.ErrFactory.crash(Unknown Source)
at com.example.hellobigworld.MainActivity.onClick(Unknown Source)
... 14 more
这样就可以恢复原来的代码了,但是还有一个情况 (Unknown Source) 是什么问题,好多开发者给友盟发support邮件,说错误统计 有问题,难道的错误log无法使用,误以为是友盟统计分析SDK的问题。实际上这个也是由于Proguard造成的,Proguard在混淆代码的 时候会做一些优化,比如行号、源文件这些信息其实VM是不需要的所以优化的时候会删除这些信息,导致SDK拿到的堆栈是没有这些信息的。
解决这个问题需要在 Proguard的配置文件中添加
-keepattributes SourceFile,LineNumberTable
这样再次崩溃的时候就有源文件和行号的信息了
11-11 13:42:03.926: E/AndroidRuntime(4189): Caused by: java.lang.ArithmeticException: divide by zero
11-11 13:42:03.926: E/AndroidRuntime(4189): at com.example.hellobigworld.a.b(ErrFactory.java:13)
11-11 13:42:03.926: E/AndroidRuntime(4189): at com.example.hellobigworld.a.a(ErrFactory.java:6)
11-11 13:42:03.926: E/AndroidRuntime(4189): at com.example.hellobigworld.MainActivity.onClick(MainActivity.java:54)
11-11 13:42:03.926: E/AndroidRuntime(4189): ... 14 more
就是这样,添加这个配置即使类和变量名丢了,行号和源文件还在。
转自:http://bbs.umeng.com/thread-7454-1-1.html
为什么友盟统计到的错误堆栈都变成 a.b.c 这样的不可读字符了? 为什么上传了 mapping文件之后还会出现(Unknown Source)?
11-11 09:36:42.262: E/AndroidRuntime(2065): Caused by: java.lang.ArithmeticException: divide by zero11-11 09:36:42.262: E/AndroidRuntime(2065): at com.example.hellobigworld.a.b(Unknown Source)
11-11 09:36:42.262: E/AndroidRuntime(2065): at com.example.hellobigworld.a.a(Unknown Source)
11-11 09:36:42.262: E/AndroidRuntime(2065): at com.example.hellobigworld.MainActivity.onClick(Unknown Source)
11-11 09:36:42.262: E/AndroidRuntime(2065): ... 14 more
变成这样的原因是代码被混淆了。ADT的某个版本之后Android自动生成的工程(Eclipse工程)在导出APK的时候都会 混淆代码,混淆之后会发现工程根目录下面多了一个文件夹proguard 里面包含四个文件:
dump.txt 存储class文件的内部结构
mapping.txt 源码到混淆之后代码的映射信息
seeds.txt 被各种 -keep 选项保留的类和成员变量信息
usage.txt 保存 unused or dead code 的信息
如果需要恢复原来的代码,需要用Proguard提供的retrace工具
D:\Tools\proguard4.10\bin>retrace mapping.txt log.txt
Caused by: java.lang.ArithmeticException: divide by zero
at com.example.hellobigworld.ErrFactory.makeException(Unknown Source)
at com.example.hellobigworld.ErrFactory.crash(Unknown Source)
at com.example.hellobigworld.MainActivity.onClick(Unknown Source)
... 14 more
这样就可以恢复原来的代码了,但是还有一个情况 (Unknown Source) 是什么问题,好多开发者给友盟发support邮件,说错误统计 有问题,难道的错误log无法使用,误以为是友盟统计分析SDK的问题。实际上这个也是由于Proguard造成的,Proguard在混淆代码的 时候会做一些优化,比如行号、源文件这些信息其实VM是不需要的所以优化的时候会删除这些信息,导致SDK拿到的堆栈是没有这些信息的。
解决这个问题需要在 Proguard的配置文件中添加
-keepattributes SourceFile,LineNumberTable
这样再次崩溃的时候就有源文件和行号的信息了
11-11 13:42:03.926: E/AndroidRuntime(4189): Caused by: java.lang.ArithmeticException: divide by zero
11-11 13:42:03.926: E/AndroidRuntime(4189): at com.example.hellobigworld.a.b(ErrFactory.java:13)
11-11 13:42:03.926: E/AndroidRuntime(4189): at com.example.hellobigworld.a.a(ErrFactory.java:6)
11-11 13:42:03.926: E/AndroidRuntime(4189): at com.example.hellobigworld.MainActivity.onClick(MainActivity.java:54)
11-11 13:42:03.926: E/AndroidRuntime(4189): ... 14 more
就是这样,添加这个配置即使类和变量名丢了,行号和源文件还在。
转自:http://bbs.umeng.com/thread-7454-1-1.html
相关文章推荐
- Logcat语法高亮显示:语法高亮显示为Android Logcat文件
- Android 开发小知识(持续更新)
- iOS CoreAnimation专题——原理篇(四)动画时间控制
- iOS开发拓展篇—CoreLocation定位服务
- hook android api伪造设备信息做刷量
- ios一步一步编译ffmpeg,x264实现h264编码
- Android 自定义View 慢慢画一个不同颜色扇形的圆,点击圆上不同颜色扇形区域返回不同颜色
- js apply
- iOS 内存泄漏整理
- IOS开发-XCode常用快捷键整理
- iOS 聊天信息图文混排
- 解决android studio debug的时候一直出现waiting for debug的情况
- Android Design Support Library(一):FloatingActionButton、TextInputLayout、TextInputEditText简单用法
- 分享iOS中常用的绘图, 截屏方法
- Swift中如何转换不同类型的Mutable指针
- Swift中如何转换不同类型的Mutable指针
- Swift中如何转换不同类型的Mutable指针
- 简单实现界面的侧滑效果(Swift)仿QQ侧滑效果
- 浏览器处理方式mime-mapping
- Swift 语言的设计错误