ฉันมีข้อผิดพลาดแปลก ๆ และฉันไม่พบว่ามันมาจากไหน สิ่งเดียวที่ปรากฏใน logcat คือ:
01-10 17:07:10.665: A/libc(20449): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
ฉันไม่ได้รับข้อผิดพลาดนี้ทันทีเมื่อฉันเรียกใช้แอป แต่ได้รับข้อผิดพลาดนี้หลังจากสุ่มผ่านไประยะหนึ่ง (ประมาณ 1 นาทีถึง 5 นาที) ฉันไม่สามารถทำซ้ำข้อผิดพลาดนี้ได้ ดูเหมือนว่าจะเป็นการสุ่ม และเนื่องจากไม่มีข้อมูลอื่น จึงเป็นการยากที่จะแก้ไข ฉันพยายามเพิ่มข้อมูลบันทึกลงในไลบรารีของฉัน แต่ยังไม่สามารถบอกได้ว่าข้อขัดข้องเกิดขึ้นที่ใด
ฉันใช้งานแอปเดียวกัน x ครั้งและได้ที่อยู่ SIGSEGV ที่แตกต่างกัน (บางครั้งก็เป็นที่อยู่เดียวกันกับเมื่อก่อน:
01-10 17:29:04.650: A/libc(21588): Fatal signal 11 (SIGSEGV) at 0x6c707063 (code=1)
01-10 17:25:55.165: A/libc(21473): Fatal signal 11 (SIGSEGV) at 0x0069004c (code=1)
01-10 17:11:58.780: A/libc(20742): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
01-10 17:00:02.010: A/libc(20160): Fatal signal 11 (SIGSEGV) at 0x00000018 (code=1)
แอพของฉันกำลังใช้ไลบรารี c++ ที่มี NetworkThread ที่ได้รับการอัปเดตจากเซิร์ฟเวอร์ ฝั่ง Java มี WorkerThread ที่ตรวจสอบว่ามีการอัพเดตใหม่จาก NetworkThread และหากมีการอัพเดตใหม่จะแจ้งให้ผู้ฟังทั้งหมดทราบ ฉันยังมี LocationSpotter (ทางฝั่ง Java) ที่ทำการโทร JNI บางส่วนเมื่อมีการอัปเดตตำแหน่ง
มีวิธีแก้ไขข้อบกพร่องนี้หรือใช้ที่อยู่ที่ฉันได้รับจาก SIGSEGV เพื่อแก้ไขข้อบกพร่องของแอปหรือไม่ นอกจากนี้ฉันกำลังใช้วัตถุ JavaVM ที่ใช้ร่วมกันสำหรับบางวิธีในการดึงข้อมูล JNIEnv ปัจจุบัน (และเรียก AttachCurrentThread) เธรดนั้นปลอดภัยหรือไม่?
ฉันสังเกตเห็นว่าฉันยังคงได้รับการอัปเดตจาก NetworkThread หลังจากที่ฉันได้รับข้อผิดพลาด SIGSEGV (ก่อนที่แอปจะขัดข้องจริงๆ) นั่นหมายความว่า NetworkThread อาจจะใช้งานได้
ฉันยังสังเกตเห็นบรรทัดที่อาจเป็นสาเหตุของปัญหาของฉัน (ในวิธี notifyAll) เนื่องจากข้อความสุดท้ายที่พิมพ์ก่อน SIGSEGV คือ "notifyAll1" :
for (unsigned i = 0; i < listeners.size(); i++) {
try {
__android_log_print(ANDROID_LOG_INFO, "FROM C++", "notifyAll1");
if (listeners.at(i) == NULL)
__android_log_print(ANDROID_LOG_INFO, "FROM C++", "LISTENER NULL");
listeners.at(i)->update(u); // <- This line is a potential suspect
__android_log_print(ANDROID_LOG_INFO, "FROM C++", "notifyAll2");
ล็อกแคท :
01-10 17:07:10.665: I/FROM C++(20449): notifyAll1
01-10 17:07:10.665: A/libc(20449): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)
ฉันพยายามพิมพ์บันทึกในบรรทัดแรกของวิธี update
ของผู้ฟังแต่ละคน แต่ไม่มีการพิมพ์ใดเลย (ซึ่งฉันคิดว่าแปลกจริงๆ)
ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก