这个问题可能是由代码引起的,但是,也可能是debug本身的问题,重启android studio ,不要以debug的方式运行

 

调试一个NDK项目,希望从java层把文件路径传给native层,再从native层打开文件 。发现在Native层C代码设置断点用Android7.0的虚拟机调试正常,而用Android10的虚拟调试断点会失效,而重启电脑后,断点又正常。

已经做的配置如下:

1、RUN——edit configurations——app——debugger: debug type 选择Auto,官网显示,对于native的调试,auto 和dual都是可以的。https://developer.android.google.cn/studio/debug

2、参照官网说明,检查设备是否支持run-as 和ptrace,正常。

 

3、对虚拟机进行WipeData和Code boot都尝试过。

 再仔细查看调试信息,发现有报错信息:

art_sigsegv_fault 0x00000000e8ae4a00
art::FaultManager::HandleFault(int, siginfo*, void*) 0x00000000e8ae4fa4
art::art_fault_handler(int, siginfo*, void*) (.llvm.5767799722020299202) 0x00000000e8ae4ccb
___lldb_unnamed_symbol25$$app_process32 0x0000000058cc3fe1
___lldb_unnamed_symbol2$$libc.so 0x00000000e9ed8180
art::Thread::DecodeJObject(_jobject*) const 0x00000000e8e8adc0
<unknown> 0x00000000ea01005d
<unknown> 0x0000000058cc2000
....


 再搜索发现在stackoverflow上有人遇到过同样的问题,说是由jstring引起的。https://stackoverflow.com/questions/69329755/android-studio-art-sigsegv-fault-when-debugging-native-methods-that-receive-a-js#

于是退而求其次,因为java层没有const char *的类型,采用的方法是:在JNI函数中直接用const char *方式写入文件路径,不再从Java层向native传路径,不算很丝滑,至少能解决断点可用的问题。

至于,为什么Android7的虚拟机就没有这个问题,为什么重启电脑会暂时解决问题,暂时没有答案,欢迎小伙伴们一直探讨。
 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐