錯誤檢查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 部分 ,作者:Yosifovich、Mark E. Russinovich、David A. 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 分析 Kernel-Mode 傾印檔案

錯誤檢查代碼參考