工具: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來說實在是太有用啦!