FMDBBlockSQLiteCallBackFunction Crash ในแอปที่ไม่ได้ใช้ makeFunctionNamed


102

ฉันกำลังทำงานกับแอพที่อยู่ในแอพสโตร์ซึ่งใช้FMDBสำหรับโต้ตอบกับฐานข้อมูล sqlite เราได้รับรายงานข้อขัดข้องที่มีสแต็กเทรซดังนี้:

Thread : Crashed: NSOperationQueue 0x170239c20 :: NSOperation 0x17024d7d0 (QOS: LEGACY)
0  libobjc.A.dylib                0x000000019701c0b4 objc_retain + 20
1  MyApp                          0x00000001002bdff4 FMDBBlockSQLiteCallBackFunction
2  MyApp                          0x00000001002bdb1c FMDBBlockSQLiteCallBackFunction
3  MyApp                          0x00000001002b66b4 FMDBBlockSQLiteCallBackFunction
4  MyApp                          0x00000001002980fc FMDBBlockSQLiteCallBackFunction
5  MyApp                          0x000000010029f20c FMDBBlockSQLiteCallBackFunction
6  CFNetwork                      0x00000001851475a4 __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 300
7  Foundation                     0x00000001866bf1c4 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 16
8  Foundation                     0x0000000186610604 -[NSBlockOperation main] + 96
9  Foundation                     0x00000001866001cc -[__NSOperationInternal _start:] + 636
10 Foundation                     0x00000001866c1f28 __NSOQSchedule_f + 228
11 libdispatch.dylib              0x0000000197655954 _dispatch_client_callout + 16
12 libdispatch.dylib              0x00000001976600a4 _dispatch_queue_drain + 1448
13 libdispatch.dylib              0x0000000197658a5c _dispatch_queue_invoke + 132
14 libdispatch.dylib              0x0000000197662318 _dispatch_root_queue_drain + 720
15 libdispatch.dylib              0x0000000197663c4c _dispatch_worker_thread3 + 108
16 libsystem_pthread.dylib        0x000000019783522c _pthread_wqthread + 816

แต่จากการอ่านFMDBรหัสที่ดูเหมือนว่าFMDBBlockSQLiteCallBackFunctionเป็นเพียงการเรียกว่าเป็นการเรียกกลับสำหรับSQLiteฟังก์ชั่นที่สร้างโดยใช้FMDatabase's makeFunctionNamed:maximumArguments:withBlock:วิธีการที่เราไม่ได้ใช้ที่ทั้งหมด

มีความคิดใดบ้างที่อาจทำให้เกิดปัญหาเช่นนี้


สิ่งนี้เกิดขึ้นหลังจากการอัปเดตแอปหรือหลังจากมีการเปลี่ยนแปลงอย่างอื่นหรือเป็นเพียงสีน้ำเงิน?

ไม่สิ่งนี้เกิดขึ้นเป็นพัก ๆ ตั้งแต่เปิดตัว เราไม่สามารถผลิตซ้ำในบ้านได้และมีเพียงรายงานข้อขัดข้องเท่านั้นที่จะดำเนินการได้ ณ จุดนี้
Greg

1
นั่นdidFinishสัญลักษณ์อาจจะเป็นคำใบ้ บางทีคุณอาจมีสภาพการแข่งขันแปลก ๆ กล่าวคือฮาร์ดแวร์สำหรับนักพัฒนาของคุณทำงานได้เร็วกว่าฮาร์ดแวร์ของผู้ใช้บางส่วนดังนั้นคุณจึงไม่เห็นปัญหาเกิดขึ้น ฉันขอแนะนำให้เลิกใช้ฮาร์ดแวร์ของคุณและดูว่าปัญหาเกิดขึ้นกับคุณหรือไม่ ถ้าเป็นเช่นนั้นการดีบักจากที่นั่นควรทำได้ง่าย
donjuedo

ฉันคิดว่าสัญลักษณ์ในการติดตามสแต็กอาจไม่ถูกต้อง ฉันเพิ่งพบข้อขัดข้องในโครงสร้างการพัฒนาของแอปที่มีลักษณะเหมือนกันในแง่ของเบรดครัมบ์ที่ฉันบันทึกด้วย CLS_LOG และเป็นกรณีของผู้แทน FMDB ที่ไม่เกี่ยวข้องกับการไม่ได้รับการตั้งค่าเป็นศูนย์ใน dealloc
Greg

@Greg มีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้หรือไม่? เราเห็นสิ่งเดียวกันนี้ในแอปหนึ่งของเรา คุณใช้ ARC หรือไม่?
funkybro

คำตอบ:


1

didFinishทำให้มีลักษณะเหมือนคุณอาจจะมีสภาพการแข่งขันในบรรทัดนี้:

6  CFNetwork                      0x00000001851475a4 __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 300

พยายามเลียนแบบฮาร์ดแวร์ที่ช้าเพื่อสร้างสถานะของผู้ใช้ปลายทาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.