Android Studio art_sigsegv_fault —— art::FaultManager::HandleFault——NDK断点失效

在调试Android NDK项目时,遇到在Android 10虚拟机上断点失效的问题,但Android 7虚拟机无此问题。尝试了多种配置,包括更改debug类型、检查设备支持、清理虚拟机数据等,问题依然存在。错误信息指向可能的jstring问题。最终通过在JNI函数内部直接使用constchar*读取文件路径避免了问题,虽然不完美,但确保了断点可用。原因尚不明,重启电脑可暂时解决。
摘要由CSDN通过智能技术生成

这个问题可能是由代码引起的,但是,也可能是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的虚拟机就没有这个问题,为什么重启电脑会暂时解决问题,暂时没有答案,欢迎小伙伴们一直探讨。
 

SIGSEGV (Segmentation fault)是一种常见的错误信号,它通常发生在程序试图访问无效的内存地址或者试图访问没有相应物理内存的地址时。这种错误通常产生于以下几种情况: 1. 缓冲区溢出:当指针引用超过其范围时,导致错误。这通常是因为指针引用了一个超出范围的缓冲区而导致的。 2. 栈溢出:当程序使用的栈空间超出了系统默认的栈大小时,就会发生栈溢出错误。 3. 非法文件访问:在某些系统中,对于禁止对文件进行操作的情况下,尝试对文件进行操作会导致此错误。 此外,SIGSEGV和SIGBUS信号之间也有一些区别。SIGBUS(总线错误)表示指针所指的地址是有效地址,但是总线无法正常使用该指针。通常是由于未对齐的数据访问引起的。而SIGSEGV(段错误)表示指针所指的地址是无效的,即没有与该地址对应的物理内存。 当遇到SIGSEGV错误时,可以通过以下方法来查找错误的根源: 1. 使用gdb调试工具:编译时使用gcc -g选项,运行程序之后等待coredump生成,然后可以使用gdb来查看调用栈,定位错误。 2. 使用strace工具:运行程序时使用strace命令,它可以显示程序在执行过程中的系统调用,可以帮助找到出错的系统调用。 总结起来,SIGSEGV (Segmentation fault)是一种常见的错误信号,通常发生在程序试图访问无效的内存地址或者试图访问没有相应物理内存的地址时。可以通过使用调试工具如gdb和strace来定位错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值