欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種應(yīng)用程序故障的定位方法

文檔序號(hào):6423910閱讀:176來(lái)源:國(guó)知局
專利名稱:一種應(yīng)用程序故障的定位方法
技術(shù)領(lǐng)域
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域中的基于Microsoft Windows操作系統(tǒng)的C語(yǔ)言應(yīng)用軟件開(kāi)發(fā),尤其涉及一種應(yīng)用程序故障的查錯(cuò)方法。
背景技術(shù)
由于Microsoft Windows操作系統(tǒng)在個(gè)人電腦的廣泛應(yīng)用,大量的軟件企業(yè)開(kāi)發(fā)了越來(lái)越多的Windows應(yīng)用程序,很多應(yīng)用是使用C語(yǔ)言開(kāi)發(fā)的,由于軟件開(kāi)發(fā)者的技能水平和程序的復(fù)雜程度不同,不少程序代碼中會(huì)有這樣或那樣的BUG(故障),嚴(yán)重的BUG可能導(dǎo)致應(yīng)用程序死掉。
現(xiàn)在比較通用的查錯(cuò)方法是使用WINDOWS提供的結(jié)構(gòu)化異常處理或運(yùn)行調(diào)試版本,很多非法地址訪問(wèn)、DIV BY ZERO(被0除)等異常都可以捕獲?,F(xiàn)有的查錯(cuò)方法是在程序產(chǎn)生故障導(dǎo)致程序退出時(shí),從程序的堆棧中查找當(dāng)前的EIP(執(zhí)行指令地址)和RET(返回地址)來(lái)判斷具體在哪個(gè)函數(shù)中運(yùn)行出錯(cuò),從而實(shí)現(xiàn)定位。
但是,即使在調(diào)試的環(huán)境下,由于有些BUG會(huì)將程序的堆棧修改,例如函數(shù)局部變量的使用不當(dāng)有可能導(dǎo)致堆棧區(qū)的非法修改,現(xiàn)有的這些方法就很難有所作為了,特別是一些作為服務(wù)運(yùn)行的程序需要長(zhǎng)時(shí)間運(yùn)行,出了問(wèn)題難以定位故障的原因。

發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題是提供一種應(yīng)用程序故障的定位方法,能夠定位包括堆棧被破壞在內(nèi)的更多的故障。
為了解決上述技術(shù)問(wèn)題,本發(fā)明提供了一種應(yīng)用程序故障的定位方法,包括以下步驟(a)在應(yīng)用程序編譯時(shí),為每一個(gè)自編碼函數(shù)做一個(gè)在函數(shù)入口處調(diào)用的鉤子函數(shù),并提供一個(gè)在自編碼函數(shù)返回時(shí)調(diào)用的隱式調(diào)用函數(shù);
(b)該應(yīng)用程序啟動(dòng)后,建立該應(yīng)用程序的進(jìn)程共享內(nèi)存區(qū),在該進(jìn)程共享內(nèi)存區(qū)中為該應(yīng)用程序的每一個(gè)線程分配一個(gè)線程共享內(nèi)存區(qū);(c)該應(yīng)用程序運(yùn)行到所述自編碼函數(shù)時(shí)調(diào)用該鉤子函數(shù);(d)該鉤子函數(shù)取得當(dāng)前執(zhí)行指令的地址標(biāo)記和當(dāng)前運(yùn)行函數(shù)的返回地址標(biāo)記,壓入相應(yīng)線程共享內(nèi)存區(qū)的堆棧區(qū),同時(shí)將該應(yīng)用程序堆棧中當(dāng)前運(yùn)行函數(shù)的返回地址修改為該隱式調(diào)用函數(shù)的入口地址;(e)當(dāng)前運(yùn)行函數(shù)返回時(shí)自動(dòng)調(diào)用該隱式調(diào)用函數(shù),該隱式調(diào)用函數(shù)將壓入的當(dāng)前執(zhí)行指令的地址標(biāo)記和當(dāng)前運(yùn)行函數(shù)的返回地址標(biāo)記彈出,并在該應(yīng)用程序堆棧區(qū)中恢復(fù)當(dāng)前運(yùn)行函數(shù)的返回地址;(f)程序繼續(xù)運(yùn)行,在每一自編碼函數(shù)調(diào)用均采用步驟(c)到步驟(d)的方法處理,如果程序正常退出,釋放該應(yīng)用程序的進(jìn)程共享內(nèi)存區(qū),結(jié)束;如果發(fā)生故障退出,執(zhí)行下一步;(g)保存該應(yīng)用程序的進(jìn)程共享內(nèi)存的數(shù)據(jù),根據(jù)所述堆棧區(qū)的當(dāng)前指針獲得應(yīng)用程序正在運(yùn)行的函數(shù)和嵌套層次,對(duì)故障進(jìn)行準(zhǔn)確定位。
進(jìn)一步地,為了獲取發(fā)生故障時(shí)的上下文信息,所述步驟(d)中,還將當(dāng)前執(zhí)行指令的地址標(biāo)記依序保存到相應(yīng)線程共享內(nèi)存區(qū)的鏈表區(qū),步驟(g)中,還對(duì)該鏈表區(qū)數(shù)據(jù)分析,獲得該線程最近執(zhí)行過(guò)的函數(shù)。
進(jìn)一步地,為了在正常的運(yùn)行環(huán)境下也能實(shí)現(xiàn)對(duì)應(yīng)用程序故障的定位,可采用跟蹤動(dòng)態(tài)庫(kù)來(lái)實(shí)現(xiàn)上述處理,即所述步驟(a)之前先建立一個(gè)包含所述鉤子函數(shù)和隱式調(diào)用函數(shù)實(shí)現(xiàn)代碼的跟蹤動(dòng)態(tài)庫(kù),所述應(yīng)用程序在編譯時(shí)靜態(tài)連接該跟蹤動(dòng)態(tài)庫(kù),實(shí)現(xiàn)對(duì)所述鉤子函數(shù)的調(diào)用,在該應(yīng)用程序啟動(dòng)后,該動(dòng)態(tài)庫(kù)在處理進(jìn)程建立消息和線程建立消息時(shí)分別創(chuàng)建所述進(jìn)程共享內(nèi)存區(qū)和線程共享內(nèi)存區(qū)。
進(jìn)一步地,為了實(shí)現(xiàn)對(duì)是否啟動(dòng)故障定位的選擇,在所述步驟(c)中,所述鉤子函數(shù)還檢查所述進(jìn)程共享內(nèi)存區(qū)中的標(biāo)記字,判斷是否啟動(dòng)故障定位,如果啟動(dòng),再執(zhí)行步驟(d),如果不啟動(dòng),直接執(zhí)行步驟(f)。
進(jìn)一步地,上述定位方法可具有以下特點(diǎn)所述動(dòng)態(tài)庫(kù)在處理進(jìn)程建立消息和線程建立消息時(shí)還分別建立線程局部存儲(chǔ)標(biāo)識(shí)和對(duì)應(yīng)的各線程唯一標(biāo)識(shí),各線程唯一標(biāo)識(shí)又對(duì)應(yīng)于各自的線程共享內(nèi)存區(qū),所述鉤子函數(shù)和隱式調(diào)用函數(shù)是通過(guò)所述線程局部存儲(chǔ)標(biāo)識(shí)找到相應(yīng)的線程唯一標(biāo)識(shí),再找到該線程的共享內(nèi)存區(qū)的。
進(jìn)一步地,為了實(shí)現(xiàn)對(duì)多個(gè)應(yīng)用程序的管理,在步驟(b)建立所述進(jìn)程共享內(nèi)存區(qū)后,還可將該應(yīng)用程序的名稱注冊(cè)到一個(gè)管理共享內(nèi)存區(qū),并記錄該應(yīng)用程序名稱與該應(yīng)用程序進(jìn)程共享內(nèi)存區(qū)的對(duì)應(yīng)關(guān)系。該管理共享內(nèi)存可由所述動(dòng)態(tài)庫(kù)創(chuàng)建,或者由一個(gè)管理程序創(chuàng)建。
進(jìn)一步地,上述定位方法可具有以下特點(diǎn)所述步驟(g)中可由一個(gè)管理程序定時(shí)檢測(cè)所述管理共享內(nèi)存區(qū)內(nèi)各應(yīng)用程序的運(yùn)行狀態(tài),如果某一應(yīng)用程序不再運(yùn)行,則根據(jù)該應(yīng)用程序名稱找到該應(yīng)用程序的進(jìn)程共享內(nèi)存區(qū)并保存其數(shù)據(jù)。
進(jìn)一步地,為了減少對(duì)應(yīng)用程序的改動(dòng),在步驟(a)編譯時(shí)可采用支持在每個(gè)函數(shù)入口自動(dòng)調(diào)用鉤子函數(shù)的編譯器,并在跟蹤動(dòng)態(tài)庫(kù)中將鉤子函數(shù)命名為該編譯器為該自動(dòng)調(diào)用的鉤子函數(shù)指定的名稱。
與現(xiàn)有技術(shù)Windows中提供的結(jié)構(gòu)化異常處理和調(diào)試版本調(diào)試環(huán)境相比,本發(fā)明應(yīng)用程序故障的定位方法具有以下優(yōu)點(diǎn)A,通過(guò)建立共享內(nèi)存,能夠定位更多的異常,例如堆棧破壞的異常;B,通過(guò)在共享內(nèi)存中建立堆棧區(qū),能夠顯示故障時(shí)函數(shù)的嵌套情況;C,通過(guò)使用windows動(dòng)態(tài)連接庫(kù),能夠在正常的運(yùn)行環(huán)境中定位應(yīng)用程序故障;D,通過(guò)在建立多個(gè)線程共享內(nèi)存區(qū),能夠?qū)Χ嗑€程的應(yīng)用程序進(jìn)行準(zhǔn)確定位;E,由于在鏈表區(qū)按順序記錄了最近執(zhí)行過(guò)的函數(shù),所以能夠得到更多的上下文信息;F,對(duì)于被跟蹤的應(yīng)用程序的改動(dòng)很少,編譯器支持啟用_penter鉤子函數(shù)時(shí),只需要在跟蹤動(dòng)態(tài)庫(kù)增加鉤子函數(shù)_penter的實(shí)現(xiàn)代碼即可;G,采用隱式調(diào)用函數(shù)來(lái)將當(dāng)前運(yùn)行函數(shù)的EIP和RET彈出堆棧,避免了顯示函數(shù)調(diào)用時(shí)須在函數(shù)每一個(gè)RETURN增加顯示函數(shù)的繁瑣。


圖1是本發(fā)明實(shí)施例共享內(nèi)存的結(jié)構(gòu)圖。
圖2是本發(fā)明實(shí)施例應(yīng)用程序函數(shù)調(diào)用過(guò)程的示意圖。
具體實(shí)施例方式
本實(shí)施例應(yīng)用程序的定位方法包括以下步驟步驟一,建立跟蹤動(dòng)態(tài)庫(kù),其中包含鉤子函數(shù)和隱式調(diào)用函數(shù)的實(shí)現(xiàn)代碼;步驟二,啟動(dòng)管理程序,判斷是否已存在管理共享內(nèi)存區(qū),如沒(méi)有則建立該內(nèi)存區(qū);步驟三,被跟蹤的應(yīng)用程序在編譯時(shí)靜態(tài)連接所需動(dòng)態(tài)庫(kù),為所有自編代碼的函數(shù)做一個(gè)在函數(shù)入口處調(diào)用的鉤子函數(shù),并提供一個(gè)在函數(shù)返回時(shí)調(diào)用的隱式調(diào)用函數(shù);步驟四,應(yīng)用程序啟動(dòng)后,動(dòng)態(tài)庫(kù)在處理進(jìn)程建立消息時(shí),建立以該應(yīng)用程序名稱命名的進(jìn)程共享內(nèi)存區(qū)以及線程局部存儲(chǔ)標(biāo)識(shí),該進(jìn)程共享內(nèi)存區(qū)中設(shè)置有一個(gè)缺省的啟動(dòng)故障定位標(biāo)記;步驟五,動(dòng)態(tài)庫(kù)將應(yīng)用程序注冊(cè)到管理共享內(nèi)存區(qū)中,建立該應(yīng)用程序名稱與該應(yīng)用程序進(jìn)程共享內(nèi)存區(qū)的對(duì)應(yīng)關(guān)系,管理程序修改該進(jìn)程共享內(nèi)存區(qū)的啟動(dòng)故障定位標(biāo)記;步驟六,動(dòng)態(tài)庫(kù)處理線程建立消息時(shí)設(shè)置該線程的唯一標(biāo)識(shí)值(可有多個(gè),標(biāo)識(shí)可依線程建立次序從0遞增),并根據(jù)線程唯一標(biāo)識(shí)值從進(jìn)程共享內(nèi)存區(qū)中為該線程分配一個(gè)線程共享內(nèi)存區(qū);建立的共享內(nèi)存的結(jié)構(gòu)如圖1所示,在管理共享內(nèi)存區(qū)中記錄了多個(gè)運(yùn)行的應(yīng)用程序的名稱,每個(gè)應(yīng)用程序名稱對(duì)應(yīng)于該程序的進(jìn)程共享內(nèi)存區(qū),進(jìn)程共享內(nèi)存區(qū)中保存有一個(gè)啟動(dòng)故障定位標(biāo)記字(該標(biāo)志位可以由應(yīng)用程序?qū)懭笔≈?,也可以由管理程序修?,并為每個(gè)線程分配了一個(gè)線程共享內(nèi)存區(qū),每個(gè)線程共享內(nèi)存區(qū)又進(jìn)一步分為鏈表區(qū)和堆棧區(qū),其存儲(chǔ)數(shù)據(jù)的方法將在下面步驟中介紹,同時(shí)參照?qǐng)D2。
步驟七,被跟蹤的應(yīng)用程序運(yùn)行到某個(gè)函數(shù)時(shí)調(diào)用鉤子函數(shù),鉤子函數(shù)首先根據(jù)進(jìn)程共享內(nèi)存區(qū)的標(biāo)記字判斷是否啟動(dòng)了故障定位功能,如果是,執(zhí)行下一步,否則直接運(yùn)行完當(dāng)前函數(shù),再執(zhí)行步驟210;步驟八,鉤子函數(shù)取得當(dāng)前的EIP(執(zhí)行指令的地址)標(biāo)記和當(dāng)前運(yùn)行函數(shù)的RET(返回地址)標(biāo)記,修改被跟蹤應(yīng)用程序的堆棧,將當(dāng)前運(yùn)行函數(shù)的返回地址修改為隱式調(diào)用函數(shù)的入口地址;步驟九,鉤子函數(shù)根據(jù)當(dāng)前線程的局部存儲(chǔ)標(biāo)識(shí)得到該線程唯一標(biāo)識(shí)值再找到該線程的共享內(nèi)存空間,將EIP和RET標(biāo)記壓入線程共享內(nèi)存區(qū)的堆棧區(qū),同時(shí)在線程共享內(nèi)存區(qū)的環(huán)形鏈表區(qū)保存EIP標(biāo)記;步驟十,當(dāng)前運(yùn)行函數(shù)執(zhí)行完返回時(shí),自動(dòng)調(diào)用隱式調(diào)用函數(shù),隱式調(diào)用函數(shù)根據(jù)該線程的局部存儲(chǔ)標(biāo)識(shí)得到該線程唯一標(biāo)識(shí)值再找到該線程的共享內(nèi)存區(qū),將壓入的EIP和該函數(shù)的RET彈出,在程序堆棧區(qū)修改該函數(shù)的返回地址為RET;步驟十一,程序繼續(xù)運(yùn)行,運(yùn)行到每個(gè)函數(shù)都重復(fù)上述步驟八至十,直到程序正常結(jié)束或發(fā)生故障退出,如果是正常退出,執(zhí)行下一步,如果是發(fā)生故障退出,執(zhí)行步驟十三;步驟十二,釋放該應(yīng)用程序的進(jìn)程共享內(nèi)存區(qū)和在管理共享內(nèi)存區(qū)中的注冊(cè)信息,結(jié)束;步驟十三,管理程序?qū)⒃搼?yīng)用程序的進(jìn)程共享內(nèi)存的數(shù)據(jù)記錄到文件;步驟十四,根據(jù)線程共享內(nèi)存區(qū)中堆棧區(qū)的當(dāng)前指針可以獲得應(yīng)用程序正在運(yùn)行的函數(shù)和嵌套層次,根據(jù)環(huán)形鏈表區(qū)順序存儲(chǔ)的EIP,可以得到該線程最近執(zhí)行過(guò)的函數(shù),從而對(duì)故障進(jìn)行準(zhǔn)確的定位。
如果被跟蹤的應(yīng)用程序有改動(dòng),需要在每個(gè)函數(shù)的入口增加調(diào)用鉤子函數(shù)的代碼。但如果編譯器支持啟用_penter鉤子函數(shù),則只需要在跟蹤動(dòng)態(tài)庫(kù)增加鉤子函數(shù)_penter的實(shí)現(xiàn)代碼即可,不需要在每個(gè)函數(shù)中增加調(diào)用鉤子函數(shù)的代碼了,函數(shù)會(huì)自動(dòng)調(diào)用名為_(kāi)penter鉤子函數(shù)。因此,應(yīng)盡量采用支持在每個(gè)函數(shù)入口自動(dòng)調(diào)用鉤子函數(shù)的編譯器,并在跟蹤動(dòng)態(tài)庫(kù)中將鉤子函數(shù)命名為編譯器為該自動(dòng)調(diào)用的鉤子函數(shù)指定的名稱。
下面用一個(gè)應(yīng)用實(shí)例來(lái)進(jìn)一步說(shuō)明本發(fā)明的效果。假設(shè)應(yīng)用程序只有一個(gè)線程,包含了A、B、C三個(gè)函數(shù)且A函數(shù)順序調(diào)用B和C函數(shù),在所有共享內(nèi)存建立完畢后,應(yīng)用程序在調(diào)用A函數(shù)時(shí),將執(zhí)行指令的地址EIP-A和A函數(shù)的返回地址RET-A壓入線程共享內(nèi)存的堆棧區(qū),而將執(zhí)行指令地址EIP-A寫(xiě)入鏈表區(qū),并修改程序堆棧中A函數(shù)的返回地址為隱式調(diào)用函數(shù)。
在A函數(shù)運(yùn)行過(guò)程中,調(diào)用B函數(shù)時(shí),將此時(shí)的執(zhí)行指令地址EIP-B和B函數(shù)返回地址RET-B壓入堆棧區(qū),并將EIP-B寫(xiě)入鏈表區(qū),這時(shí)鏈表區(qū)存有EIP-A和EPI-B,堆棧區(qū)內(nèi)存有EIP-A、RET-A和EIP-B、RET-B。即使此時(shí)發(fā)生異常并修改了程序堆棧,通過(guò)對(duì)堆棧區(qū)記錄數(shù)據(jù)的分析可以定位到B函數(shù)。
如果B函數(shù)運(yùn)行正常,在返回時(shí)會(huì)將EIP-B和RET-B從堆棧區(qū)中彈出,但在鏈表區(qū)的EIP-B保留。程序繼續(xù)運(yùn)行,如果在調(diào)用C函數(shù)時(shí)發(fā)生故障,可以同時(shí)從堆棧區(qū)數(shù)據(jù)中找到調(diào)用C函數(shù)時(shí)的EIP-C和C函數(shù)的返回地址RET-C,以及原來(lái)的EIP-A和RET-A,從而準(zhǔn)確得知正在運(yùn)行的函數(shù)和嵌套層次。
在運(yùn)行時(shí)B或C函數(shù)也有可能是系統(tǒng)調(diào)用或其他動(dòng)態(tài)庫(kù)提供的函數(shù),這時(shí)該函數(shù)沒(méi)有鉤子函數(shù)。假定在C函數(shù)發(fā)生異常,應(yīng)用本實(shí)施例方法后,鏈表區(qū)中會(huì)記錄有EIP-B,而堆棧區(qū)中會(huì)記錄有EIP-A和RET-A,EIP-B和RET-B已被彈出,因而在這種情況下也可以分析出是在調(diào)用了B函數(shù)之后發(fā)生異常。從這里可以看出鏈表區(qū)提供的上下文信息對(duì)于準(zhǔn)確定位的作用。
很明顯,對(duì)于有多個(gè)線程的應(yīng)用程序,從各線程共享內(nèi)存區(qū)中也可以得到各自的記錄,對(duì)各個(gè)線程出現(xiàn)的故障快速準(zhǔn)確地定位。
此外,為了使應(yīng)用程序故障定位在管理程序未啟動(dòng)的情況下也能執(zhí)行,本實(shí)施例在動(dòng)態(tài)庫(kù)處理進(jìn)程建立消息時(shí),還檢查是否存在管理程序使用的共享內(nèi)存,若不存在則建立,并寫(xiě)入自己的應(yīng)用程序的名稱。應(yīng)用程序的啟動(dòng)故障定位標(biāo)記字可以采用缺省選項(xiàng)。該管理共享內(nèi)存也可以由動(dòng)態(tài)庫(kù)來(lái)創(chuàng)建,管理程序不是必須啟動(dòng),如果應(yīng)用程序異常退出時(shí),可以手工啟動(dòng)管理程序來(lái)記錄堆棧。
權(quán)利要求
1.一種應(yīng)用程序故障的定位方法,包括以下步驟(a)在應(yīng)用程序編譯時(shí),為每一個(gè)自編碼函數(shù)生成一個(gè)在函數(shù)入口處調(diào)用的鉤子函數(shù),并提供一個(gè)在自編碼函數(shù)返回時(shí)調(diào)用的隱式調(diào)用函數(shù);(b)該應(yīng)用程序啟動(dòng)后,建立該應(yīng)用程序的進(jìn)程共享內(nèi)存區(qū),在該進(jìn)程共享內(nèi)存區(qū)中為該應(yīng)用程序的每一個(gè)線程分配一個(gè)線程共享內(nèi)存區(qū);(c)該應(yīng)用程序運(yùn)行到所述自編碼函數(shù)時(shí)調(diào)用該鉤子函數(shù);(d)該鉤子函數(shù)取得當(dāng)前執(zhí)行指令的地址標(biāo)記和當(dāng)前運(yùn)行函數(shù)的返回地址標(biāo)記,壓入相應(yīng)線程共享內(nèi)存區(qū)的堆棧區(qū),同時(shí)將該應(yīng)用程序堆棧中當(dāng)前運(yùn)行函數(shù)的返回地址修改為該隱式調(diào)用函數(shù)的入口地址;(e)當(dāng)前運(yùn)行函數(shù)返回時(shí)自動(dòng)調(diào)用該隱式調(diào)用函數(shù),該隱式調(diào)用函數(shù)將壓入的當(dāng)前執(zhí)行指令的地址標(biāo)記和當(dāng)前運(yùn)行函數(shù)的返回地址標(biāo)記彈出,并在該應(yīng)用程序堆棧區(qū)中恢復(fù)當(dāng)前運(yùn)行函數(shù)的返回地址;(f)程序繼續(xù)運(yùn)行,在每一自編碼函數(shù)調(diào)用均采用步驟(c)到步驟(d)的方法處理,如果程序正常退出,釋放該應(yīng)用程序的進(jìn)程共享內(nèi)存區(qū),結(jié)束;如果發(fā)生故障退出,執(zhí)行下一步;(g)保存該應(yīng)用程序的進(jìn)程共享內(nèi)存的數(shù)據(jù),根據(jù)所述堆棧區(qū)的當(dāng)前指針獲得應(yīng)用程序正在運(yùn)行的函數(shù)和嵌套層次,對(duì)故障進(jìn)行準(zhǔn)確定位。
2.如權(quán)利要求1或2所述的定位方法,其特征在于,所述步驟(d)中,還將當(dāng)前執(zhí)行指令的地址標(biāo)記依序保存到相應(yīng)線程共享內(nèi)存區(qū)的鏈表區(qū),步驟(g)中,還對(duì)該鏈表區(qū)數(shù)據(jù)分析,獲得該線程最近執(zhí)行過(guò)的函數(shù)。
3.如權(quán)利要求1或2所述的定位方法,其特征在于,所述步驟(a)之前先建立一個(gè)包含所述鉤子函數(shù)和隱式調(diào)用函數(shù)實(shí)現(xiàn)代碼的跟蹤動(dòng)態(tài)庫(kù),所述應(yīng)用程序在編譯時(shí)靜態(tài)連接該跟蹤動(dòng)態(tài)庫(kù),實(shí)現(xiàn)對(duì)所述鉤子函數(shù)的調(diào)用,在該應(yīng)用程序啟動(dòng)后,該動(dòng)態(tài)庫(kù)在處理進(jìn)程建立消息和線程建立消息時(shí)分別創(chuàng)建所述進(jìn)程共享內(nèi)存區(qū)和線程共享內(nèi)存區(qū)。
4.如權(quán)利要求3所述的定位方法,其特征在于,所述步驟(c)中,所述鉤子函數(shù)還檢查所述進(jìn)程共享內(nèi)存區(qū)中的標(biāo)記字,判斷是否啟動(dòng)故障定位,如果啟動(dòng),再執(zhí)行步驟(d),如果不啟動(dòng),直接執(zhí)行步驟(f)。
5.如權(quán)利要求3所述的定位方法,其特征在于,所述動(dòng)態(tài)庫(kù)在處理進(jìn)程建立消息和線程建立消息時(shí)還分別建立線程局部存儲(chǔ)標(biāo)識(shí)和對(duì)應(yīng)的各線程唯一標(biāo)識(shí),各線程唯一標(biāo)識(shí)又對(duì)應(yīng)于各自的線程共享內(nèi)存區(qū),所述鉤子函數(shù)和隱式調(diào)用函數(shù)是通過(guò)所述線程局部存儲(chǔ)標(biāo)識(shí)找到相應(yīng)的線程唯一標(biāo)識(shí),再找到該線程的共享內(nèi)存區(qū)的。
6.如權(quán)利要求1或2所述的定位方法,其特征在于,在步驟(b)建立所述進(jìn)程共享內(nèi)存區(qū)后,還將該應(yīng)用程序的名稱注冊(cè)到一個(gè)管理共享內(nèi)存區(qū),并記錄該應(yīng)用程序名稱與該應(yīng)用程序進(jìn)程共享內(nèi)存區(qū)的對(duì)應(yīng)關(guān)系。
7.如權(quán)利要求6所述的方法,其特征在于,所述管理共享內(nèi)存是由所述動(dòng)態(tài)庫(kù)創(chuàng)建的,或者由一個(gè)管理程序創(chuàng)建的。
8.如權(quán)利要求1或2所述的定位方法,其特征在于,所述步驟(g)中是由一個(gè)管理程序定時(shí)檢測(cè)所述管理共享內(nèi)存區(qū)內(nèi)各應(yīng)用程序的運(yùn)行狀態(tài),如果某一應(yīng)用程序不再運(yùn)行,則根據(jù)該應(yīng)用程序名稱找到該應(yīng)用程序的進(jìn)程共享內(nèi)存區(qū)并保存其數(shù)據(jù)。
9.如權(quán)利要求4所述的定位方法,其特征在于,在步驟(a)編譯時(shí)采用支持在每個(gè)函數(shù)入口自動(dòng)調(diào)用鉤子函數(shù)的編譯器,并在跟蹤動(dòng)態(tài)庫(kù)中將鉤子函數(shù)命名為該編譯器為該自動(dòng)調(diào)用的鉤子函數(shù)指定的名稱。
全文摘要
本發(fā)明公開(kāi)一種應(yīng)用程序故障的定位方法,包括以下步驟應(yīng)用程序編譯時(shí),為自編碼函數(shù)做一個(gè)在入口處調(diào)用的鉤子函數(shù);程序啟動(dòng)后,建立該程序的進(jìn)程共享內(nèi)存區(qū),并為每一個(gè)線程分配線程共享內(nèi)存區(qū);運(yùn)行到所述自編碼函數(shù)時(shí)調(diào)用鉤子函數(shù),將當(dāng)前的執(zhí)行指令地址標(biāo)記(EIP)和當(dāng)前運(yùn)行函數(shù)返回地址標(biāo)記(RET)壓入相應(yīng)線程共享內(nèi)存區(qū)的堆棧區(qū),并將程序堆棧中的RET修改為隱式調(diào)用函數(shù)的入口地址;函數(shù)返回時(shí)自動(dòng)調(diào)用隱式調(diào)用函數(shù),將壓入的EIP和RET彈出,并恢復(fù)程序堆棧的RET;程序發(fā)生故障退出后,根據(jù)所述堆棧區(qū)的當(dāng)前指針可獲得應(yīng)用程序正在運(yùn)行的函數(shù)和嵌套層次,即使應(yīng)用程序堆棧被破壞,也能實(shí)現(xiàn)對(duì)故障的準(zhǔn)確定位。
文檔編號(hào)G06F11/36GK1728106SQ20041007076
公開(kāi)日2006年2月1日 申請(qǐng)日期2004年7月26日 優(yōu)先權(quán)日2004年7月26日
發(fā)明者董偉杰, 王新余 申請(qǐng)人:中興通訊股份有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
黄山市| 射洪县| 神木县| 新兴县| 怀化市| 德清县| 永春县| 新晃| 嵊州市| 山东省| 射洪县| 金溪县| 汕头市| 苍山县| 上虞市| 五常市| 定安县| 新安县| 繁峙县| 桃园市| 凌云县| 夏邑县| 茌平县| 汉中市| 图木舒克市| 三门县| 武川县| 信丰县| 巍山| 固阳县| 澳门| 遂昌县| 郸城县| 鸡西市| 汉阴县| 竹溪县| 冷水江市| 丰宁| 宁乡县| 海丰县| 开平市|