了解读取指向内存映射文件的KERN_MEMORY_ERROR地址的崩溃

时间:2018-08-14 11:39:39

标签: macos debugging crash mmap lmdb

我试图弄清楚如果地址位于内存边界之内,从映射文件读取将如何触发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

0 个答案:

没有答案