我试图弄清楚如果地址位于内存边界之内,从映射文件读取将如何触发KERN_MEMORY_ERROR。
这是一个此类崩溃的示例,其中尝试从lmdb格式的文件中读取(可能已损坏)。可以清楚地看到无效地址位于lmdb映射文件mapped file
区域内。
因此,任何访问映射范围内的地址的尝试都可以直接从内存中检索页面内容,或触发页面错误陷阱,最终导致从磁盘读取丢失的数据并将其也返回到进程。
引起关注的一件事是文件大小仅为24k,映射范围超过256M。但是,文件的元数据似乎与文件内容保持一致。
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_MEMORY_ERROR at 0x000000010648800a
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Bus error: 10
Termination Reason: Namespace SIGNAL, Code 0xa
Terminating Process: exc handler [0]
VM Regions Near 0x10648800a:
__LINKEDIT 0000000106464000-000000010647f000 [ 108K] r--/rwx SM=COW ^Z^C [/usr/lib/dyld]
--> mapped file 000000010647f000-000000011647f000 [256.0M] r--/rwx SM=PRV Object_id=9034edd9
STACK GUARD 000070000f2b3000-000070000f2b4000 [ 4K] ---/rwx SM=NUL stack guard for thread 1
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 myprog 0x0000000101666756 mdb_page_search_root + 39
1 myprog 0x00000001016660f7 mdb_page_search + 182
2 myprog 0x00000001016614de mdb_cursor_set + 88
3 myprog 0x0000000101661476 mdb_get + 134