簡介
STATUS_IN_PAGE_ERROR---頁內故障,這是當Windows嘗試從內存映射文件將數據讀入RAM並發生阻止數據讀取的I / O錯誤時發生的非常低級別的錯誤。當它發生在.exe時,如setup.exe程序,這是一個致命的錯誤,因為它無法執行無法讀取的代碼。表示0x%p處的指令引用了位於0x%p的內存。由於0x%x的I/O錯誤狀態,未將所需數據放入內存。線程試圖訪問一個不存在的頁面,並且系統無法加載頁面。-即程序或內存映射文件無法調出,因為它不再可訪問。設備如果讀取出錯,驅動程序可以返回此異常。其定義如下:
//
// MessageId: STATUS_IN_PAGE_ERROR
//
// MessageText:
//
// The instruction at 0x%p referenced memory at 0x%p. The required data was not placed into memory because of an I/O error status of 0x%x.
//
#define STATUS_IN_PAGE_ERROR ((NTSTATUS)0xC0000006L) // winnt
異常結構說明
ExceptionAddress: 03638c90 (libcef!v8::internal::CopyCharsUnsigned<unsigned char,unsigned short>+0x00000020)
ExceptionCode: c0000006 (In-page I/O error)
ExceptionFlags: 00000000
NumberParameters: 3
Parameter[0]: 00000000
Parameter[1]: 07b41828//IO操作失敗的內存地址
Parameter[2]: c000000e//具體IO操作錯誤
Inpage operation failed at 07b41828, due to I/O error c000000e
說明
應用程序有時從網絡共享啟動,一些客戶在運行應用程序時報告了外部異常C0000006。根據我在谷歌的研究,這個“可能”與Image被調出和無法從網絡重新加載有關。解決方法是通過設置IMAGE_FILE_NET_RUN_FROM_SWAP標志,告訴Windows將完整的映像文件加載到交換中並從那里運行它。我的應用程序還依賴於運行時加載的各種.bpl和.dll庫。其中只有一部分可以由我更改,有些由其他供應商提供。如果exe設置了這個標志,這個庫會發生什么?是否也加載到交換文件中,還是仍被調出並在需要時重新加載?我是否也需要在庫中包含此標志?該標志僅適用於設置它的PE模塊。因此,在EXE中設置標志並不意味着該EXE加載的模塊會受到該標志的影響。由EXE加載的每個模塊(DLL、包等)將由加載程序根據該模塊中指定的PE選項進行處理。因此,您需要在網絡共享上的每個模塊上設置PE標志。
我還建議添加IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP。