錯誤檢查0x3B:SYSTEM_SERVICE_EXCEPTION

SYSTEM_SERVICE_EXCEPTION錯誤檢查的值為 0x0000003B。 這表示在執行從非特殊許可權程式代碼轉換為特殊許可權程序代碼的例程時發生例外狀況。

重要

本文適用於程式設計人員。 如果您是在使用計算機時收到藍色畫面錯誤碼的客戶,請參閱 針對藍色畫面錯誤進行疑難解答。

SYSTEM_SERVICE_EXCEPTION參數

參數 描述
1 造成錯誤檢查的例外狀況。
2 導致錯誤檢查的指示位址
3 造成錯誤檢查之例外狀況的內容記錄位址
4 0 (未使用)

原因

此停止程式代碼表示執行程式代碼有例外狀況,且其下方的線程是系統線程。

這可能會因為已取值 NULL 指標或存取隨機不正確的地址而發生。 這反過來又可能是因為記憶體過早釋放或數據結構損毀所造成。

參數 1 中傳回的例外狀況資訊會在 NTSTATUS 值描述。 例外狀況代碼定義於 ntstatus.h 中,這是 Windows 驅動程式套件所提供的頭檔。 (如需詳細資訊,請參閱 Windows 驅動程式套件中的頭檔。

常見的例外狀況代碼包括:

  • 0x80000003:STATUS_BREAKPOINT

    當系統未連結任何核心調試程式時,遇到斷點或ASSERT。

  • 0xC0000005:STATUS_ACCESS_VIOLATION

    發生記憶體存取違規。

解決方法

若要判斷特定原因,以及建立程式碼修正,則需要程式設計體驗和存取錯誤模組的原始程式碼。

若要對此問題進行偵錯,請使用 .cxr (顯示內容記錄) 命令搭配參數 3,然後使用 kb(顯示堆棧回溯)。 您也可以在此停止程式代碼之前的程式碼中設定斷點,並嘗試向前單一步驟執行錯誤碼。 使用 uubuu (unassemble) 命令來查看元件程式代碼。

!analyze 調試程式延伸模組會顯示錯誤檢查的相關信息,並有助於判斷根本原因。 下列範例是 !analyze輸出。

SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the bugcheck
Arg2: fffff802328375b0, Address of the instruction which caused the bugcheck
Arg3: ffff9c0a746c2330, Address of the context record for the exception that caused the bugcheck
Arg4: 0000000000000000, zero.
...

如需 WinDbg 和 !analyze 的詳細資訊,請參閱下列主題:

如需 Windows 記憶體使用量的詳細資訊,請參閱 Windows Internals 7th Edition 第 1 部分,By Pavel Yosifovich、Mark E. Russinovich、David A. 所羅門和 Alex Ionescu。

識別驅動程式

如果可以識別負責錯誤的驅動程式,則會在藍色螢幕上列印其名稱,並儲存在位於KiBugCheckDriver位置 PUNICODE_STRING的記憶體中。 您可以使用 dx (顯示調試程式物件模型表示式)、調試程式命令來顯示下列專案:dx KiBugCheckDriver

kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffe10b9991e3e8 : "nvlddmkm.sys" [Type: _UNICODE_STRING *]

使用 !error 擴充功能來顯示參數 1 中例外狀況程式代碼的相關信息。 以下是 ! error 輸出的範例。

2: kd> !error 00000000c0000005
Error code: (NTSTATUS) 0xc0000005 (3221225477) - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.

查看 WinDbg 的 STACK TEXT 輸出,以取得失敗發生時執行狀況的線索。 如果有多個傾印檔案可供使用,請比較其資訊,以尋找堆疊中的常見程序代碼。 使用 kb(顯示堆疊回溯)之類的調試程式命令來調查錯誤程序代碼。

使用下列命令來列出記憶體中載入的模組: lm t n

使用 !memusage 來檢查系統記憶體的一般狀態。 您也可以使用命令 !pte!pool 來檢查特定記憶體區域。

過去,此錯誤已連結至過度使用分頁集區,這可能是因為使用者模式圖形驅動程式越過並傳遞不正確的數據至核心程式碼而發生。 如果您懷疑這是這種情況,請使用驅動程式驗證器中的集區選項來收集其他資訊。

驅動程式驗證器

驅動程式驗證器是一種工具,可即時執行以檢查驅動程序的行為。 例如,驅動程式驗證器會檢查記憶體資源的使用方式,例如記憶體集區。 如果它識別驅動程式程式代碼執行中的錯誤,它會主動建立例外狀況,以允許進一步審查該部分的驅動程序程序代碼。 驅動程式驗證器管理員內建於 Windows 中,可在所有 Windows 電腦上使用。

若要啟動驅動程式驗證器管理員,請在命令提示字元中輸入 驗證程式 。 您可以設定要驗證的驅動程式。 驗證驅動程式的程式代碼會在執行時增加額外負荷,因此請嘗試驗證可能最少的驅動程式數目。 如需詳細資訊,請參閱驅動程式驗證器

備註

如需 Windows 錯誤檢查代碼的一般疑難解答,請遵循下列建議:

  • 如果最近新增了新的設備驅動器或系統服務,請嘗試移除或更新它們。 嘗試判斷系統中導致出現新錯誤檢查程式代碼的變更。

  • 查看 裝置管理員,以查看是否有任何裝置標示為驚嘆號 (!),這表示問題。 檢閱任何故障設備驅動器屬性中顯示的事件記錄檔。 嘗試更新相關的驅動程式。

  • 請檢查系統登入 事件檢視器 是否有其他錯誤訊息,以協助找出造成錯誤的裝置或驅動程式。 在與藍色畫面相同的時間範圍中,尋找系統記錄檔中發生的嚴重錯誤。

  • 如果您最近將硬體新增至系統,請嘗試移除或取代它。 或者,請洽詢製造商以查看是否有任何修補程式可供使用。

如需其他一般疑難解答資訊,請參閱 分析錯誤檢查藍屏幕數據

另請參閱

使用 Windows 調試程式進行損毀傾印分析 (WinDbg)

使用 WinDbg 分析內核模式傾印檔案

錯誤檢查代碼參考