首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JNI Fatal Signal 11 (SIGSEGV) 錯誤排查指南

     編輯:程式設計疑難解答

錯誤現象

應用崩潰並輸出 Fatal signal 11 (SIGSEGV) at 0x75462000 (code=1), thread 5686,屬於典型的內存訪問違規,定位困難。

排查步驟

  1. 啟用NDK調試:在 build.gradle 中配置 ndk { debugSymbolLevel 'FULL' }。
  2. 使用AddressSanitizer:編譯時添加 -fsanitize=address 標誌,運行時可捕獲越界訪問、使用後釋放等問題。
  3. 分析Tombstone文件:崩潰後在 /data/tombstones/ 生成詳盡堆棧信息,包含故障指令地址、寄存器狀態。
  4. 結合Logcat與ndk-stack:將堆棧地址轉換為源碼行號:ndk-stack -sym $PROJECT_DIR/obj/local/arm64-v8a -dump logcat.txt。

常見原因與修復

  • 野指針解引用:檢查JNI層傳遞的jobject是否已被GC回收,需用 NewGlobalRef 管理生命週期。
  • 數組越界:嚴格校驗 GetArrayLength 與訪問索引。
  • 線程安全:JNIEnv不可跨線程使用,需通過 AttachCurrentThread 獲取當前線程環境。

完整案例分析見博客實戰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved