JNI crash定位

05-25 03:02:28.166: I/DEBUG(131): Build fingerprint: 'SEMC/MT11i_1254-8478/MT11i:2.3.4/4.0.2.A.0.42/1f_v3w:user/release-keys'
05-25 03:02:28.166: I/DEBUG(131): pid: 23962, tid: 23970  >>> xx.xx <<<
05-25 03:02:28.166: I/DEBUG(131): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
05-25 03:02:28.166: I/DEBUG(131):  r0 fffffe84  r1 deadd00d  r2 00000026  r3 00000000
05-25 03:02:28.166: I/DEBUG(131):  r4 6ca9f600  r5 0082e608  r6 6ca9f600  r7 6ca86a13
05-25 03:02:28.166: I/DEBUG(131):  r8 00000000  r9 00000000  10 41b19e18  fp 302d5758
05-25 03:02:28.166: I/DEBUG(131):  ip 6ca9f70c  sp 302d5258  lr 6fd19209  pc 6ca402c8  cpsr 20000030
05-25 03:02:28.166: I/DEBUG(131):  d0  643a64696f72646e  d1  6472656767756265
05-25 03:02:28.166: I/DEBUG(131):  d2  6874654d24746967  d3  677241646e41640a
05-25 03:02:28.166: I/DEBUG(131):  d4  7373656d223d7261  d5  3c3e226f74656761
05-25 03:02:28.166: I/DEBUG(131):  d6  30313e65756c6176  d7  7840313430303030
05-25 03:02:28.166: I/DEBUG(131):  d8  00000000437c0000  d9  0000000000000000
05-25 03:02:28.166: I/DEBUG(131):  d10 0000000000000000  d11 0000000000000000
05-25 03:02:28.166: I/DEBUG(131):  d12 0000000000000000  d13 0000000000000000
05-25 03:02:28.166: I/DEBUG(131):  d14 0000000000000000  d15 0000000000000000
05-25 03:02:28.166: I/DEBUG(131):  d16 0000000000000000  d17 3ff0000000000000
05-25 03:02:28.166: I/DEBUG(131):  d18 4028000000000000  d19 3ff0000000000000
05-25 03:02:28.166: I/DEBUG(131):  d20 3ff0000000000000  d21 4197d78400000000
05-25 03:02:28.166: I/DEBUG(131):  d22 0000000000000000  d23 0000000000000000
05-25 03:02:28.166: I/DEBUG(131):  d24 0000000000000000  d25 3ff0000000000000
05-25 03:02:28.166: I/DEBUG(131):  d26 0000000000000000  d27 3ff2e8ba20000000
05-25 03:02:28.166: I/DEBUG(131):  d28 0100010001000100  d29 3ff0000000000000
05-25 03:02:28.166: I/DEBUG(131):  d30 0000000000000000  d31 3ff0000000000000
05-25 03:02:28.166: I/DEBUG(131):  scr 20000012
05-25 03:02:28.186: I/DEBUG(131):          #00  pc 000402c8  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #01  pc 0006565c  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #02  pc 000658fe  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #03  pc 00065916  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #04  pc 0003f9fc  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #05  pc 0003fa58  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #06  pc 000634d2  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #07  pc 0006537a  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #08  pc 00046a04  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):          #09  pc 0003a594  /data/data//lib/libxxx.so
05-25 03:02:28.186: I/DEBUG(131): code around pc:
05-25 03:02:28.186: I/DEBUG(131): 6ca402a8 447a4479 f7d14c0b 2000e982 ea86f7d1 
05-25 03:02:28.186: I/DEBUG(131): 6ca402b8 447c4809 6bdb5823 4798b103 22264902 
05-25 03:02:28.186: I/DEBUG(131): 6ca402c8 f7d1700a bf00eaee deadd00d 00043947 
05-25 03:02:28.186: I/DEBUG(131): 6ca402d8 00045505 0005f342 fffffe84 4b09b40e 
05-25 03:02:28.186: I/DEBUG(131): 6ca402e8 4c09b517 aa05447b f852591b 6b5b1b04 
05-25 03:02:28.186: I/DEBUG(131): code around lr:
05-25 03:02:28.186: I/DEBUG(131): 6fd191e8 4a0e4b0d e92d447b 589c41f0 26004680 
05-25 03:02:28.186: I/DEBUG(131): 6fd191f8 686768a5 f9b5e006 b113300c 47c04628 
05-25 03:02:28.186: I/DEBUG(131): 6fd19208 35544306 37fff117 6824d5f5 d1ef2c00 
05-25 03:02:28.186: I/DEBUG(131): 6fd19218 e8bd4630 bf0081f0 00028334 ffffff88 
05-25 03:02:28.186: I/DEBUG(131): 6fd19228 b086b570 f602fb01 9004460c a804a901 
05-25 03:02:28.186: I/DEBUG(131): stack:
05-25 03:02:28.186: I/DEBUG(131):     302d5218  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d521c  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d5220  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d5224  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d5228  6fd4272c  
05-25 03:02:28.186: I/DEBUG(131):     302d522c  6fd426d8  
05-25 03:02:28.186: I/DEBUG(131):     302d5230  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d5234  6fd19209  /system/lib/libc.so
05-25 03:02:28.186: I/DEBUG(131):     302d5238  0005f342  
05-25 03:02:28.186: I/DEBUG(131):     302d523c  0082e608  
05-25 03:02:28.186: I/DEBUG(131):     302d5240  6ca9f600  
05-25 03:02:28.186: I/DEBUG(131):     302d5244  6ca86a13  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):     302d5248  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d524c  6fd18301  /system/lib/libc.so
05-25 03:02:28.186: I/DEBUG(131):     302d5250  df002777  
05-25 03:02:28.186: I/DEBUG(131):     302d5254  e3a070ad  
05-25 03:02:28.186: I/DEBUG(131): #00 302d5258  00a4bbd0  
05-25 03:02:28.186: I/DEBUG(131):     302d525c  6ca65661  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131): #01 302d5260  2d3cfd7d  
05-25 03:02:28.186: I/DEBUG(131):     302d5264  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d5268  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d526c  6caa4d38  
05-25 03:02:28.186: I/DEBUG(131):     302d5270  00a4bbd0  
05-25 03:02:28.186: I/DEBUG(131):     302d5274  6ca86a13  /system/lib/libdvm.so
05-25 03:02:28.186: I/DEBUG(131):     302d5278  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d527c  00000000  
05-25 03:02:28.186: I/DEBUG(131):     302d5280  0038104c  
05-25 03:02:28.186: I/DEBUG(131):     302d5284  302d5354  
05-25 03:02:28.186: I/DEBUG(131):     302d5288  41b19e18  
05-25 03:02:28.186: I/DEBUG(131):     302d528c  6ca65903  /system/lib/libdvm.so
05-25 03:02:28.576: I/BootReceiver(274): Copying /data/tombstones/tombstone_02 to DropBox (SYSTEM_TOMBSTONE)


如果出现上面的错误,说明调用JNI中的某个方法出错了,但具体那个方法很难定位!

首先要知道是那个so出错,可以看上面的stack错误,这里发现 libxxx.so是我自己写的so;

可以利用   /arm-linux-androideabi-addr2line -f -e  libxxx.so 0003a594

// /usr/local/android-ndk-r7-crystax-1/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-addr2line -f -e   libxxx.so 0003a594

<think>好的,我现在需要帮助用户解决如何通过NDK生成的crash日志精确定位到对应的代码行数的问题。首先,我应该回顾一下用户提供的引用内容,看看有没有相关的信息可以利用。 用户提到了引用[2]中的内容,里面提到willCrash()方法出错在260行,这说明在crash日志中可能已经包含了具体的行号信息。但用户可能需要更详细的步骤来自己定位问题。另外,引用[3]提到定位问题需要复现步骤,而引用[4]涉及JNI方法声明和参数类型,可能和崩溃原因相关。 接下来,我需要整理NDK崩溃定位的常规方法。首先,NDK崩溃通常会生成堆栈跟踪,但如果没有符号化,这些信息是难以理解的。所以第一步应该是确保有符号表(比如.so文件附带调试信息)。然后,使用addr2line或者ndk-stack工具将地址转换为代码行数。 可能用户遇到的问题是如何使用这些工具。例如,使用ndk-stack需要将日志通过adb获取,然后运行命令进行解析。而addr2line则需要具体的地址和对应的带有调试信息的.so文件。另外,编译时需要开启调试信息,即编译选项中加入-g,否则可能无法获取行号信息。 还要考虑日志中的崩溃类型,比如空指针、内存越界等,这些可能在日志中有不同的表现。同时,需要检查JNI代码中的常见错误,比如引用管理不当、数组越界、类型不匹配等,如引用[4]中的参数类型是否正确。 另外,用户可能需要知道如何设置Android项目的调试选项,确保生成带调试符号的Native库。可能在CMake或Android.mk中配置,例如在CMakeLists.txt中添加“set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g”)。 还有,如果崩溃发生在JNI函数中,可能需要结合Java和Native的堆栈信息,查看是否有对应的JNI错误,比如使用CheckJNI来检测问题,这可能在开发阶段帮助捕获错误。 总结下来,步骤应该是: 1. 确保编译时生成调试符号。 2. 获取崩溃日志(logcat)。 3. 使用ndk-stack或addr2line解析日志中的地址。 4. 结合代码审查可能的错误点,如JNI引用、参数传递等。 需要检查用户是否遗漏了某些步骤,比如未保留带符号的so文件,或者没有正确使用工具解析。此外,可能还需要建议用户使用Android Studio的LLDB调试工具,或者配置Breakpad来捕获更详细的崩溃信息。 最后,根据用户提供的引用,尤其是引用[2]和[3],需要强调复现步骤和精确解析日志的重要性。可能还需要提醒用户注意日志中的寄存器信息和崩溃地址对应的具体的代码段。</think>### 如何通过NDK生成的crash日志定位代码行数? #### 1. **确保编译时包含调试符号** - 在编译Native代码时,需在`CMakeLists.txt`或`Android.mk`中添加调试符号生成选项。例如: ```cmake set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") # 添加-g参数保留调试信息 ``` - **验证符号文件**:生成的`.so`文件应包含调试信息(可通过`file libxxx.so`检查是否包含`with debug_info`)。 #### 2. **获取完整的崩溃日志** - 使用`adb logcat`捕获崩溃日志,并过滤相关进程: ```bash adb logcat | grep "xxx" # 替换为崩溃的关键词或进程名 ``` - 典型NDK崩溃日志示例: ``` signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 backtrace: #00 pc 00001234 /data/app/lib/arm64/libnative.so (function_name+0x1234) ``` #### 3. **使用`ndk-stack`工具解析地址** - 将日志保存为文件(如`crash.log`),运行以下命令: ```bash ndk-stack -sym /path/to/obj/local/armeabi-v7a/ -dump crash.log ``` - `-sym`参数指定包含符号文件的目录(对应ABI架构)。 - **输出示例**: ``` #00 pc 00001234 libnative.so (function_name+1234) (file.cpp:260) ``` 直接显示代码文件和行号(如`file.cpp:260`)[^2]。 #### 4. **手动使用`addr2line`转换地址** - 若未集成`ndk-stack`,可用`addr2line`工具: ```bash aarch64-linux-android-addr2line -e libnative.so 00001234 ``` - 需选择对应架构的`addr2line`(位于NDK的`toolchains`目录下,如`aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin`)[^1]。 #### 5. **结合代码审查常见JNI错误** - **空指针或内存越界**:检查JNI函数中的指针操作和数组边界。 - **引用管理问题**:未正确释放局部引用(`DeleteLocalRef`)或误用全局引用。 - **参数类型不匹配**:如Java的`long`对应JNI的`jlong`,避免类型强制转换错误(参考引用[4]中的参数对应关系)。 #### 6. **使用Android Studio的LLDB调试** - 在Android Studio中启用`Debug native code`,断点调试Native代码。 - 若崩溃可稳定复现,直接运行并触发崩溃,IDE会自动定位到代码行[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ada

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值