Android报错:Fatal signal 11 (SIGSEGV), code 1, fault addr 0x1150b4550 in tid 6236
工具:android studio3.5.2
进入logcat查看报错日志:
pid: 8125, tid: 8125, name: le.login_server >>> com.example.login_server <<<
2020-02-27 16:55:47.079 8653-8653/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x1150b4550
....
2020-02-27 16:55:47.085 8653-8653/? A/DEBUG: backtrace:
2020-02-27 16:55:47.085 8653-8653/? A/DEBUG: #00 pc 000000000007b6c4 /data/app/com.example.login_server-1/lib/arm64/libcrypto.so (BN_div+104)
2020-02-27 16:55:47.085 8653-8653/? A/DEBUG: #01 pc 0000000000081bf4 /data/app/com.example.login_server-1/lib/arm64/libcrypto.so (BN_nnmod+44)
2020-02-27 16:55:47.085 8653-8653/? A/DEBUG: #02 pc 000000000007c490 /data/app/com.example.login_server-1/lib/arm64/libcrypto.so (BN_mod_exp_recp+216)
2020-02-27 16:55:47.085 8653-8653/? A/DEBUG: #03 pc 0000000000001358 /data/app/com.example.login_server-1/lib/arm64/libnative_lib.so (_Z8encryLocv+268)
2020-02-27 16:55:47.086 8653-8653/? A/DEBUG: #04 pc 0000000000001a88 /data/app/com.example.login_server-1/lib/arm64/libnative_lib.so (Java_com_example_login_1server_MyUtils_native_1lib_getk1k2+364)
2020-02-27 16:55:47.086 8653-8653/? A/DEBUG: #05 pc 0000000000384eb4 /data/app/com.example.login_server-1/oat/arm64/base.odex (offset 0x35b000)
大家一定要仔细看看报error的日志,可以看到出现和run处弹出的bug相同处,也就是错误地址0x1150b4550,后面追溯:backtrace:这里面出现的错误具体路径你应当熟悉(你的项目的路径你肯定清楚啦)。
此下废话,可不看:
我看到libcrypto.so我就明白大致就是我android项目中支持的c++文件在运行过程中报错,尤其是看到了Java_com_example_login_1server_MyUtils_native_1lib_getk1k2,这是我c通过jni调用的一个函数,大概错误出现在这个回调函数里面,而在追溯路径后面括号中的字符,是我调用的openssl函数,大概这些地方也出现问题了,我在网上百度了一些fatal signal报错处理,但事实上大家因项目不同,不太容易碰到一个和你相同的问题,更何况时解决方法(与android版本和sdk有时候也有关系),所以大家更多时候是自己看看日志来调式处理。
软件测试异常主要有:
因为我通过循环调用一个cpp方法(通过jni),软件登录后第一次调用显示正常,在第二次调用时,界面自动退出并重新登录,以此循环。。。日志报错
解决方法:
(此段废话)因为明白了错误在cpp文件中,我去查看了cpp文件,首先看调用的地方,在子线程中,难道说子线程中不支持通过jni调用c++???我尝试把函数调用放在线程外,很显然,并没有解决,于是我在函数调用处以及cpp文件内部设置断点,debug来调试!第一次调用正常,第二次我进入cpp内部在进行大整数模余运算处给我报错了!!!我去!我的大整数k1,k2在函数内部释放空间后第二次调用没有初始化,我的h,x大整数释放空间后并没有赋值为null,导致第二次调用时他的空间未分配的前提下直接使用,在一处while循环中直接进入死循环!
(此段重要)我的出错地点是:cpp文件中大整数初始化以及释放空间机制不完善。
解决方法:每调用一次应当释放空间并赋值为null,下一次调用判空后再初始化,当然也可以不用赋值为null,那么下次调用时就判空,直接进入初始化。经测试,问题解决。
如果你的报错和我相似,但是问题不一样,我建议你查看loacat追溯一下到底是哪里有问题,并debug判断大致出现问题的地方,一点一点缩小问题区间对于大的project来说实在是太有用啦!