新四季網

Windows程序異常捕獲及定位方法

2023-04-23 15:06:41


專利名稱::Windows程序異常捕獲及定位方法
技術領域:
:本發明涉及程序異常處理
技術領域:
,特別是一種Windows環境下的程序異常捕獲及定位方法。
背景技術:
:目前各類程式語言都提供了程序異常處理機制,如C++語言中的try…catch語句。try關鍵字引導著一塊可能會引起意外的正常處理代碼,catch關鍵字引導著一塊意外處理代碼。一旦try這個區中引發了一個意外,對程序流程的控制就切換到相應的catch區域。但這種程序異常處理的方式必須知道可能發生的程序異常類型,而且會降低程序運行的性能,所以該種程序異常處理機制一般只用於局部的已知異常處理,如微軟基礎類庫(MFC)中的CFile類在文件操作失敗時會拋出文件異常(CFileException)。CFile是MFC提供的一個類,它提供了訪問文件的接口。CFile類用來處理正常文件的輸入/輸出操作,它直接提供磁碟輸入/輸出服務,並且通過其派生類間接支持文本文件和內存文件。在使用CFile的成員函數進行文件操作時,可使用try…catch語句來捕獲CFileException類型的異常。而對於程序未處理的未知程序異常的捕獲,特別是針對程序異常的定位目前還沒有一個通用的處理方式。即使通過常規方式進行程序異常捕獲,也無法對程序異常的發生位置進行定位。例如,由於程序編碼錯誤導致訪問非法的內存,這種程序異常是在編碼時無法預測的,因此,也就無法使用現有的程序異常處理機制來進行異常捕獲,更談不上在程序異常發生時對程序異常進行定位了。當程序中使用了多個動態連接庫時,如果動態連接庫中發生程序異常,現有的程序異常處理技術更是無法確定程序異常發生在哪個動態連接庫中,使程序異常的定位非常困難。
發明內容有鑑於此,本發明的目的在於提供一種Windows程序異常捕獲及定位方法,利用一種通用的方法來捕獲和定位Windows環境下程序未處理的未知異常,以提高系統自身定位錯誤的能力。為了達到上述目的,本發明提供了一種Windows程序異常捕獲及定位方法,其特徵在於包含以下步驟A、通過系統設置的Windows異常過濾鉤子捕獲Windows環境下程序未處理的異常,交異常過濾鉤子函數處理;B、由異常過濾鉤子函數記錄每層函數完成調用後返回時要執行的指令地址,定位出異常發生前程序的函數調用順序;C、通過程序的函數調用順序,得到所調用的每一模塊的起始地址,根據起始地址查詢到模塊的名稱,完整地重現程序異常發生的過程。步驟A包括所述的Windows異常過濾鉤子是通過系統函數設置篩選器異常函數(SetUnhandleExceptionFilter)實現的。步驟B,對於記錄棧頂地址的函數進一步包括B11、異常過濾鉤子函數讀取當前基址寄存器中的內存地址;B12、系統函數判斷讀取到的內存地址是否為合法地址,如果為合法地址,則異常過濾鉤子函數讀取的內存地址為當前函數進入棧頂時的棧頂地址,如果為非法地址,則停止函數調用順序的搜索;B13、異常過濾鉤子函數讀取當前基址寄存器中內存地址的上一個連續內存地址中存放的內容,該內容為上層調用函數完成調用後返回時要執行的指令地址,記錄該指令地址用於重現函數調用順序;B14、異常過濾鉤子函數讀取當前基址寄存器內存地址中存放的內容,該內容為上層調用函數進入棧時的棧頂地址,返回執行步驟B12。步驟B,對於不記錄棧頂地址的函數進一步包括B21、異常過濾鉤子函數逐一讀取每一個內存地址;B22、系統函數判斷讀取到的內存地址是否為合法地址,如果為合法地址,繼續執行,如果為非法地址,則停止函數調用順序的搜索;B23、異常過濾鉤子函數判斷該內存地址中存放的指令內容的上一條指令是否為函數調用call指令,如果是call指令則認為是函數調用關係;B24、異常過濾鉤子函數繼續讀取上一個連續內存地址,返回執行步驟B22。步驟B12進一步包括異常過濾鉤子函數第一次讀取的內存地址為合法地址時,該內存地址為發生程序異常的當前函數進入棧頂時的棧頂地址。判斷讀取到的內存地址是否為合法地址是採用系統函數確定讀指針合法性(IsBadReadPtr)實現的。步驟C進一步包括程序的函數調用關係發生在動態連接庫中,通過程序的函數調用順序,得到所調用的動態連接庫中文件的起始地址,根據起始地址查詢到動態連接庫的名稱。步驟C進一步包括根據記錄的每層函數完成調用後返回時要執行的指令地址查詢虛擬地址,得到每一條指令地址與其所屬模塊在內存中的起始地址的偏移量。本發明通過系統設置的Windows異常過濾鉤子捕獲程序異常,並將程序異常交由異常過濾鉤子函數處理,異常過濾鉤子函數詳細記錄程序異常的各種信息,完整重現程序異常發生過程,以實現對程序異常的定位。本發明很好地解決了對Windows程序各種未知異常的捕獲和程序異常的定位,為程序的未知異常的捕獲和定位提供了一種通用的方法。通過對程序異常的捕獲和內存數據的分析得到程序異常發生的位置,提高了系統對程序異常定位的能力,提高了對產品問題定位的能力,為程序異常的處理提供了更加有效的途徑。圖1示出了異常過濾鉤子函數進行函數調用順序的搜索流程框圖;圖2示出了依據本發明重現函數調用順序的搜索步驟示意圖。具體實施例方式為了使本發明的目的、技術方案和優點更加清楚,下面結合附圖對本發明作進一步地詳細描述。程序異常是指程序運行時出現的非正常狀況,代表了程序的某種反常狀態,即程序異常狀況。這種程序中出現的異常會產生某些錯誤。為了更好的處理程序異常,本發明提供了Windows程序異常捕獲及定位方法。本發明主要包含兩個方面的內容一是對Windows環境下程序未處理的異常的捕獲;二是對程序異常發生位置的定位。要定位程序異常,首先要捕獲程序異常。對於程序異常的捕獲是通過設置Windows異常過濾鉤子來實現的。Windows異常過濾鉤子的設置可通過調用系統函數設置篩選器異常函數(SetUnhandleExceptionFilter)來完成。在Windows程序發生異常而程序本身又沒有處理的情況下,Windows異常過濾鉤子將程序異常交由異常過濾鉤子函數處理。異常過濾鉤子函數將記錄程序異常發生時系統內各種寄存器的值、程序異常發生時的代碼地址、程序異常的類型和程序異常標誌。同時異常過濾鉤子函數還將記錄當前程序的棧內容,通過分析棧內容搜索出程序異常發生之前函數的調用順序,並得到所調用的每一個模塊在內存中的起始地址,依據起始地址查詢到模塊的名稱或動態連接庫中文件的名稱,從而重現程序異常發生的過程。函數調用call指令會將完成調用後返回時要執行的下一條指令的地址壓入棧中。棧是內存中的一個連續存儲空間,棧的底部是一個固定地址。通常棧是由內存的高地址端向低地址端增長。棧中有兩個重要的指針寄存器棧指針寄存器(ESP)是尋址棧的存儲區,確定當前棧頂的位置,用於訪問棧段的棧頂單元;基址寄存器(EBP)用來存放一個內存地址,指向棧段中的一個存儲單元,用於訪問棧段中的任意單元。在函數調用順序的搜索過程中,根據當前EBP寄存器來定位函數進入棧時的棧頂地址,得到call指令壓入的指令地址,從而得到當前函數的上層調用函數進入棧時的棧頂地址,進而重現函數的調用順序。高級語言在編譯有參數的程序時,會在棧中記錄調用函數進入棧時的棧頂地址,而當前函數的棧頂地址則保存在EBP寄存器中。當程序中發生函數調用時,計算機進行如下操作首先把參數壓入棧;然後保存函數調用完成返回後要執行的指令地址,作為返回地址;第三個放入棧的是EBP指針,隨後把當前的棧頂指針拷貝到EBP中,作為新的基地址;最後將棧指針減去適當的數值,作為存儲本地變量的預留空間。下面就程序異常定位的過程進行描述。圖1示出了異常過濾鉤子函數進行函數調用順序的搜索流程框圖,如圖1所示步驟101~步驟102Windows異常過濾鉤子捕獲到程序發生異常,將程序異常從異常過濾鉤子函數入口交由異常過濾鉤子函數處理。異常過濾鉤子函數讀取當前EBP寄存器中的內存地址,即為當前棧頂的棧頂地址。步驟103系統函數確定讀指針合法性函數(IsBadReadPtr)判斷步驟102讀取到的內存地址是否為合法地址。如果為合法地址,執行步驟104;如果為非法地址,執行步驟109。在系統中應用程式使用的內存空間是有限的,每個系統會對應用程式使用的內存空間進行限定,即內存地址應在某個範圍中,當內存地址超出這個內存地址範圍即為非法地址。重現函數調用順序時,異常過濾鉤子函數會不斷地向上讀取內存地址,判斷該內存地址是否在設定的內存地址範圍內,如果在設定的範圍內即為合法地址;當內存地址越來越大,超出了設定的內存地址範圍,即為非法地址。步驟104~步驟106步驟102讀取到的內存地址為程序異常所在的當前函數進入棧時的棧頂地址;異常過濾鉤子函數讀取步驟102讀取到的內存地址的上一個連續內存地址中存放的內容,該內容為上層調用函數完成調用當前函數後,返回時要執行的指令地址,記錄該指令地址用於重現函數調用順序。步驟107~步驟108異常過濾鉤子函數讀取步驟102讀取到的內存地址中存放的內容,該內容為上層調用函數進入棧時的棧頂地址,讀取到該內容後執行步驟103。步驟109搜索結束。讀取到的內存地址為非法地址時,異常過濾鉤子函數停止搜索。為了使圖1的描述更加清晰,下面舉例說明圖1的過程。假定函數的調用順序為函數FunA調用函數FunB,函數FunB調用函數FunC。在函數FunC中,異常過濾鉤子捕獲到程序異常。函數FunB進入棧時的棧頂地址為0012F6B8;函數FunB完成調用函數FunC後,返回時要執行的指令地址為00401C9D。函數FunC進入棧時的棧頂地址為0012F660。函數FunB調用函數FunC時,將調用函數FunC完成後,返回時要執行的指令地址00401C9D壓入棧,然後將函數FunB進入棧時的棧頂地址0012F6B8壓入棧,並將ESP寄存器中當前的棧頂地址0012F660賦值給EBP寄存器,作為函數FunC的基地址,該值即為函數FunC進入棧時的棧頂地址。為了使圖1的步驟更加清晰,下面結合圖2做進一步的說明。棧地址及棧地址中存放的內容均為內存地址。圖2示出了依據本發明重現函數調用順序的搜索步驟示意圖,函數調用順序的搜索步驟如圖2所示異常過濾鉤子函數讀取當前EBP寄存器中的棧地址(內存地址)0012F660,系統函數確定讀指針合法性函數(IsBadReadPtr)判斷內存地址0012F660是否為合法地址。如果內存地址0012F660為合法地址,則該內存地址0012F660即為當前函數FunC進入棧時的棧頂地址,以上過程與圖1的步驟102、103、104相對應。異常過濾鉤子函數讀取內存地址0012F660的上一個連續內存地址0012F664中存放的內容(內存地址)00401C9D。內存地址00401C9D為上層調用函數FunB完成調用函數FunC後,返回時要執行的指令地址。記錄指令地址00401C9D用於重現函數調用順序。以上過程與圖1的步驟105、106相對應。異常過濾鉤子函數讀取內存地址0012F660中存放的內容(內存地址)0012F6B8。系統函數確定讀指針合法性函數(IsBadReadPtr)判斷內存地址0012F6B8是否為合法地址。如果內存地址0012F6B8為合法地址,棧地址(內存地址)0012F660中存放的內容(內存地址)0012F6B8為上層調用函數FunB調用當前函數FunC時被壓入棧的基地址,內存地址0012F6B8即為上層調用函數FunB進入棧時的棧頂地址。以上過程與圖1的步驟107、103、104相對應。異常過濾鉤子函數讀取內存地址0012F68的上一個連續內存地址0012F6BC中存放的內容(內存地址)00401A5D。內存地址00401A5D為上層調用函數FunA完成調用函數FunB後,返回時要執行的指令地址。記錄指令地址00401A5D用於重現函數調用順序。以上過程與圖1的步驟105、106相對應。異常過濾鉤子函數讀取內存地址0012F6B8中存放的內容(內存地址)ebp。系統函數確定讀指針合法性函數(IsBadReadPtr)判斷內存地址ebp的合法性。如果內存地址ebp為合法地址,棧地址(內存地址)0012F6B8中存放的內容(內存地址)ebp為上層調用函數FunA調用函數FunA時被壓入棧的基地址,內存地址ebp即為上層調用函數FunA進入棧時的棧頂地址。以上過程與圖1的步驟107、103、104相對應。如此重複,根據EBP寄存器得到再上層調用函數進入棧時的棧頂地址和完成調用後返回時要執行的指令地址,直到讀取到的內存地址為非法地址,使函數的調用順序得以完整重現。對於一些不記錄棧頂地址的函數,可以通過逐一分析內容,找到call指令壓入棧的指令地址,從而確定出函數的調用順序。這裡首先假設棧中壓入的內容全部為call指令壓入的指令地址,然後逐一讀取每一個內存地址,系統函數確定讀指針合法性函數(IsBadReadPtr)判斷讀取到的內存地址是否為合法地址。如果為合法地址,則判斷該內存地址中存放的指令內容的上一條指令是否為call指令,如果是call指令則認為是函數調用關係。依次向上搜索,判斷是否為函數調用關係,直至讀取到的內存地址為非法地址。在得到了函數調用關係的層次後,根據程序異常定位過程中記錄的每層函數完成調用後返回時要執行的指令地址來查詢虛擬地址,得到每一指令地址所屬模塊在內存中的起始地址。作業系統讓系統看上去有比實際內存大得多的內存空間。虛擬內存可以是系統中實際物理空間的許多倍。虛擬內存系統中的所有地址都是虛擬地址而不是物理地址。每個進程都有自己的唯一虛擬地址空間。內存映射技術將映象文件和數據文件直接映射到進程的地址空間。在內存映射中,文件的內容被直接連接到進程的虛擬地址空間上。每個段都有一個定位自身起始位置的虛擬地址。因此需要完成虛擬地址到物理地址的轉換。由於內存中的起始地址是內存中的實際地址,實際地址就是內存單元的物理地址。模塊在每次啟動時所處內存中的位置並不固定,因此得到的實際地址會有所不同。偏移地址是存儲器單元所在位置到段基址的距離,在程序運行中偏移地址是固定的。所以需要得到指令地址所在的段和段內偏移地址。有了各模塊的起始地址,就可以根據可移植執行體(PE-PortableExecutable)文件格式分析出模塊內指令地址所在的段和段內偏移地址。PE文檔是微軟設計用於其所有Win32位作業系統(WindowsNT、Windows95、Win32s)的可執行文檔。這樣就可以得到固定的相對位置。通過模塊起始地址查詢模塊名稱的方法,獲取該起始地址所在模塊的模塊名稱。當函數調用是發生在不同的動態連接庫中時,這裡得到的就是動態連接庫中文件的名稱。有了函數調用順序和各函數所在模塊的模塊名稱,就能很清楚的看到在程序異常發生之前是哪些模塊逐一調用了哪些函數,最終導致了程序異常的發生,這也就使程序異常的發生過程得以完整地重現。總之,以上所述僅為本發明的較佳實施例而已,並非用於限定本發明的保護範圍。權利要求1.一種Windows程序異常捕獲及定位方法,其特徵在於包含以下步驟A、通過系統設置的Windows異常過濾鉤子捕獲Windows環境下程序未處理的異常,交異常過濾鉤子函數處理;B、由異常過濾鉤子函數記錄每層函數完成調用後返回時要執行的指令地址,定位出異常發生前程序的函數調用順序;C、通過程序的函數調用順序,得到所調用的每一模塊的起始地址,根據起始地址查詢到模塊的名稱,完整地重現程序異常發生的過程。2.根據權利要求1所述的Windows程序異常捕獲及定位方法,其特徵在於所述的步驟A包括所述的Windows異常過濾鉤子是通過系統函數設置篩選器異常函數(SetUnhandleExceptionFilter)實現的。3.根據權利要求1所述的Windows程序異常捕獲及定位方法,其特徵在於所述的步驟B,對於記錄棧頂地址的函數進一步包括B11、異常過濾鉤子函數讀取當前基址寄存器中的內存地址;B12、系統函數判斷讀取到的內存地址是否為合法地址,如果為合法地址,則異常過濾鉤子函數讀取的內存地址為當前函數進入棧頂時的棧頂地址,如果為非法地址,則停止函數調用順序的搜索;B13、異常過濾鉤子函數讀取當前基址寄存器中內存地址的上一個連續內存地址中存放的內容,該內容為上層調用函數完成調用後返回時要執行的指令地址,記錄該指令地址用於重現函數調用順序;B14、異常過濾鉤子函數讀取當前基址寄存器內存地址中存放的內容,該內容為上層調用函數進入棧時的棧頂地址,返回執行步驟B12。4.根據權利要求1所述的Windows程序異常捕獲及定位方法,其特徵在於所述的步驟B,對於不記錄棧頂地址的函數進一步包括B21、異常過濾鉤子函數逐一讀取每一個內存地址;B22、系統函數判斷讀取到的內存地址是否為合法地址,如果為合法地址,繼續執行,如果為非法地址,則停止函數調用順序的搜索;B23、異常過濾鉤子函數判斷該內存地址中存放的指令內容的上一條指令是否為函數調用call指令,如果是call指令則認為是函數調用關係;B24、異常過濾鉤子函數繼續讀取上一個連續內存地址,返回執行步驟B22。5.根據權利要求3所述的步驟B12進一步包括異常過濾鉤子函數第一次讀取的內存地址為合法地址時,該內存地址為發生程序異常的當前函數進入棧頂時的棧頂地址。6.根據權利要求3或4所述的Windows程序異常捕獲及定位方法,其特徵在於所述的判斷讀取到的內存地址是否為合法地址是採用系統函數確定讀指針合法性(IsBadReadPtr)實現的。7.根據權利要求1所述的Windows程序異常捕獲及定位方法,其特徵在於所述的步驟C進一步包括程序的函數調用關係發生在動態連接庫中,通過程序的函數調用順序,得到所調用的動態連接庫中文件的起始地址,根據起始地址查詢到動態連接庫的名稱。8.根據權利要求1或7所述的Windows程序異常捕獲及定位方法,其特徵在於所述的步驟C進一步包括根據記錄的每層函數完成調用後返回時要執行的指令地址查詢虛擬地址,得到每一條指令地址與其所屬模塊在內存中的起始地址的偏移量。全文摘要本發明公開了一種Windows程序異常捕獲及定位方法,涉及Windows環境下程序異常處理領域,包括通過系統設置的Windows異常過濾鉤子捕獲Windows環境下程序未處理的異常,並將程序異常交由異常過濾鉤子函數處理,由異常過濾鉤子函數定位出程序異常發生前函數的調用順序;然後異常過濾鉤子函數依據函數的調用順序搜索到所調用的每一個模塊在內存中的起始地址,再通過起始地址查詢到模塊的名稱,使程序異常的發生過程得以完整地重現,完成對程序異常的捕獲及定位,從而提高了系統對異常定位的能力,提高了對產品問題定位的能力,為異常的處理提供了更加有效的途徑。文檔編號G06F9/42GK1492320SQ0214596公開日2004年4月28日申請日期2002年10月25日優先權日2002年10月25日發明者黃勇,黃勇申請人:華為技術有限公司

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀