史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   作業系統操作技術文件 (http://forum.slime.com.tw/f128.html)
-   -   Microsoft Error Code 揭秘 (http://forum.slime.com.tw/thread147278.html)

psac 2005-04-15 02:18 PM

Microsoft Error Code 揭秘
 
Microsoft Error Code 揭秘
----------------------------------
Author: Smallfrogs
Version: 1.0 [2005/03/26]
======================================================
微軟產品有一個良好的設計就是當出現錯誤的時候,會有各種各樣的錯誤號碼出現。在Windows 2000以前,錯誤號以10進制一般,到了Windows 2000以後,錯誤號更多的趨向於使用16進製表示。

微軟產品的錯誤程式碼都是定義在一些.h文件裡面的,如Win32API的錯誤程式碼就定義在winerror.h文件裡面。

在WIN32API裡面,錯誤號的定義格式是這樣的:
(摘自winerror.h)
程式碼 (雙按程式碼複製到貼上板)// 類型s are 32 bit values layed out as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +---+-+-+-----------------------+-------------------------------+
// |Sev|C|R| Facility | Code |
// +---+-+-+-----------------------+-------------------------------+
//
// where
//
// Sev - is the severity code
//
// 00 - Success
// 01 - Informational
// 10 - Warning
// 11 - Error
//
// C - is the Customer code flag
//
// R - is a reserved bit
//
// Facility - is the facility code
//
// Code - is the facility's status code

如上所顯示,錯誤代號由32bit 組成,也就是說所有的WIN32API裡面的錯誤代號必須遵照上述格式。除了錯誤代號,微軟還定義了大量的巨集用於記憶和閱讀起來方便。巨集的定義是採用 C/C++ 關鍵字define完成的。格式是:

程式碼 (雙按程式碼複製到貼上板)#defiine <字串串檔案類型的錯誤代號> <數值檔案類型的錯誤代號>

此外,微軟對大多數常用的錯誤代號作了簡單的文字描述。用戶可以使用微軟提供的API函數 FormatMessage 將錯誤代號轉換為對應的文字描述。

使用FormatMessage的一個典型工具就是在 Visual C++ 6 裡面提供的Error LookUp。這個工具能夠將用戶輸入的錯誤代號轉化為對應的文字描述(如果有的話)。此外,以前網路上比較流行的錯誤號尋找工具也使用了FormatMessage這個函數。

FormatMessage的一個Sample是這樣的:
程式碼 (雙按程式碼複製到貼上板)void ErrorExit(LPTSTR lpszFunction)
{
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );

wsprintf(szBuf,
"%s failed with error %d: %s",
lpszFunction, dw, lpMsgBuf);

MessageBox(NULL, szBuf, "Error", MB_OK);

LocalFree(lpMsgBuf);
ExitProcess(dw);
}
當然,到了具體使用中,還有其他更複雜的考慮,如進制轉換等。

但是由於微軟產品眾多,很難在同一個文件裡面將所有錯誤程式碼包含,而且不同產品由於各種原因,造成不同了不同的產品可能有不同的錯誤程式碼的格式,如果說人為的查閱各種.h文件試圖找到一個方法,可想而知的是這樣做的效率如何。在這種情況下,一個全新的工具 出現了。

這就是我今天要推薦的一個錯誤號查詢工具:Err.exe

工具是關於指令行方式操作的,1.62M的程序內裝了絕大多數微軟產品的錯誤程式碼。當然也包括了上面介紹的Win32API的錯誤程式碼。

據我所知,目前版本的Err.EXE飽含了19871種錯誤程式碼訊息,涵蓋了172個文件。我想這個數位對於絕大多數用戶來說已經足夠了。

Err.EXE的使用方式是:
錯誤程式碼作為Err.EXE的參數傳入Err.EXE,要查詢錯誤程式碼的時候,輸入以下指令。假設我查詢一個叫做 0x50 的錯誤代號的含義,則輸入
程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x50
Err.EXE將返回和0x50有關的錯誤代號的含義。
返回的結果分為4個部分:
1、以#開頭的是作者增加的註釋
2、左半部分指錯誤代號對應的巨集定義文字訊息
3、右半部分各種.h文件表示是在什麼文件裡面發現這個錯誤代號的。
4、最下面是搜尋到多少個對應的錯誤程式碼。

又因為發生0x50錯誤的時候是在一個I/O操作的時候,我大概可以判定錯誤可能來源於Win32API函數,於是檢查有winerror.h的那行,發現Err.EXE指出的含義是:

ERROR_FILE_EXISTS

根據這個訊息再進去行後續的工作就方便多了。

提示:Err.EXE支持省略輸入
如果需要輸入的內容是:
程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x00000050
那麼可以省略輸入為
程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x50
Err.EXE也能夠準確的識別出你輸入的內容。

更難能可貴的事,Err.EXE還能夠支持對錯誤字串串搜尋來反查詢錯誤程式碼,而且對於不能搜尋到的錯誤號能夠將錯誤號分段,然後猜測大概的意思,能做到這樣一個是由於微軟產品設計的規範性,另一個原因就是Err.EXE的開發者的獨具匠心的設計。

最後,附上 Err.EXE 下載位址:
http://www.microsoft.com/downloads/d...displaylang=en

Note:不要被微軟網頁迷惑,Err.EXE不僅適用於Exchange,而且適用於絕大多數的微軟產品。

Note:Err.EXE屬於綠色軟體,從微軟網站下載以後是一個自解壓文件,你可以使用WinRAR解壓,解壓以後有一份說明 我的文件,使用前建議先看看它,看完了以後對於快速掌握Err.EXE是很有說明 的。

附件是VC6帶的Error Lookup工具,大家可以試試看看。如果有興趣,可以把上面說的那段程式碼編譯一下看看,你會驚奇的發現 Error Lookup 的設計還是很簡單的。


所有時間均為台北時間。現在的時間是 09:47 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1