NDK 使用 addr2line 定位 Fatal signal (SIGSEGV) 错误
2017-12-26 14:36
651 查看
使用NDK编写native code时候,真机常会出现crash的错误。然后logcat就是一片错误堆栈。
[cpp] view
plain copy
I/DEBUG ( 2562): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 40123d5c
I/DEBUG ( 2562): backtrace:
I/DEBUG ( 2562): #00 pc 00000d5c <unknown>
I/DEBUG ( 2562): #01 pc 0009f8db /system/lib/libstagefright.so (android::SmoothStreamingExtractor::SmoothStreamingExtractor(android::sp<android::DataSource> const&)+366)
I/DEBUG ( 2562): #02 pc 00082f89 /system/lib/libstagefright.so (android::MediaExtractor::Create(android::sp<android::DataSource> const&, char const*)+500)
I/DEBUG ( 2562): #03 pc 00045cdf /system/lib/libmediaplayerservice.so (android::AmlogicPlayerExtractorDemux::AmlogicPlayerExtractorDemux(AVFormatContext*)+438)
I/DEBUG ( 2562): #04 pc 0004602d /system/lib/libmediaplayerservice.so (android::AmlogicPlayerExtractorDemux::extractor_read_header(AVFormatContext*, AVFormatParameters*)+20)
I/DEBUG ( 2562): #05 pc 00102210 /system/lib/libamplayer.so (avformat_open_input_header+604)
....
曾经一直用log的方式查看揣测错误的代码行数。熟不知这些看似淫乱的错误日志其实就是错误堆栈的相关信息,只需要一个工具转换即可。
[cpp] view
plain copy
android-ndk-r10\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line
使用方式很简单
[cpp] view
plain copy
// -f 输出函数名
// -e 输出错误代码行数和文件路径
// xxx.so 对应出错的so文件, 在android工程obj目录下
// addr 是具体的地址
arm-linux-androideabi-addr2line -f -e xxx.so addr
错误日志中backtracer就是堆栈信息,#00 #01 就是堆栈列表。 #00 就是堆栈顶层就是错误所在地址,pc后面的就是地址00000d5c
[cpp] view
plain copy
arm-linux-androideabi-addr2line -f -e /system/lib/libstagefright.so 00000d5c
这样瞬间就能定位错误了。。。
注意这个so文件是android工程obj目录里面的,而不是libs里面的。
obj目录是带有debug信息的库文件,libs的库文件是没有debug信息的,addr2line无法读取源代码信息。
[cpp] view
plain copy
I/DEBUG ( 2562): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 40123d5c
I/DEBUG ( 2562): backtrace:
I/DEBUG ( 2562): #00 pc 00000d5c <unknown>
I/DEBUG ( 2562): #01 pc 0009f8db /system/lib/libstagefright.so (android::SmoothStreamingExtractor::SmoothStreamingExtractor(android::sp<android::DataSource> const&)+366)
I/DEBUG ( 2562): #02 pc 00082f89 /system/lib/libstagefright.so (android::MediaExtractor::Create(android::sp<android::DataSource> const&, char const*)+500)
I/DEBUG ( 2562): #03 pc 00045cdf /system/lib/libmediaplayerservice.so (android::AmlogicPlayerExtractorDemux::AmlogicPlayerExtractorDemux(AVFormatContext*)+438)
I/DEBUG ( 2562): #04 pc 0004602d /system/lib/libmediaplayerservice.so (android::AmlogicPlayerExtractorDemux::extractor_read_header(AVFormatContext*, AVFormatParameters*)+20)
I/DEBUG ( 2562): #05 pc 00102210 /system/lib/libamplayer.so (avformat_open_input_header+604)
....
曾经一直用log的方式查看揣测错误的代码行数。熟不知这些看似淫乱的错误日志其实就是错误堆栈的相关信息,只需要一个工具转换即可。
[cpp] view
plain copy
android-ndk-r10\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line
使用方式很简单
[cpp] view
plain copy
// -f 输出函数名
// -e 输出错误代码行数和文件路径
// xxx.so 对应出错的so文件, 在android工程obj目录下
// addr 是具体的地址
arm-linux-androideabi-addr2line -f -e xxx.so addr
错误日志中backtracer就是堆栈信息,#00 #01 就是堆栈列表。 #00 就是堆栈顶层就是错误所在地址,pc后面的就是地址00000d5c
[cpp] view
plain copy
arm-linux-androideabi-addr2line -f -e /system/lib/libstagefright.so 00000d5c
这样瞬间就能定位错误了。。。
注意这个so文件是android工程obj目录里面的,而不是libs里面的。
obj目录是带有debug信息的库文件,libs的库文件是没有debug信息的,addr2line无法读取源代码信息。
相关文章推荐
- NDK 使用 addr2line 定位 Fatal signal (SIGSEGV) 错误
- 利用ssh下载symbols并通过addr2line定位so库错误位置的用法
- Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 错误 解决方案(android-ndk)
- Android NDK使用addr2line符号化得到错误函数名的问题
- 使用addr2line分析代码错误
- 使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- 使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- 使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 错误 解决方案(android-ndk)
- Crash 问题定位 -----使用addr2line命令定位到行号
- NDK调试arm-linux-androideabi-addr2line工具的使用
- Fatal signal xx (SIGSEGV) at xxxxxx 错误定位代码的解决方法
- Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 错误 解决方案(android-ndk)
- 根据内核Oops 定位代码工具使用— addr2line 、gdb、objdump
- 【摘录】使用arm-eabi-addr2line, ndk-stack工具跟踪Android调用堆栈
- 根据内核Oops 定位代码工具使用— addr2line 、gdb、objdump
- ndk工具使用之arm-eabi-addr2line 【转http://www.2cto.com/kf/201207/140136.html】
- 关于Android JNI 编程如何定位段错误的问题(addr2line的使用)
- arm-eabi-addr2line 使用解析crash位置
- 使用FUNCNAME 和BASH_LINENO实现shell脚本中定位函数错误在代码中的位置