專利名稱:用于分析運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件開發(fā),并且更具體地,涉及計(jì)算機(jī)程序的運(yùn)行時(shí)存儲(chǔ)器分析。
背景技術(shù):
許多現(xiàn)代程序設(shè)計(jì)語言不支持防止運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的程序設(shè)計(jì)結(jié)構(gòu)。運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤可以包括、但不限于從未初始化的存儲(chǔ)器讀取或?qū)懭搿⒊鏊x的數(shù)組的范圍讀取或?qū)懭?、存?chǔ)器泄漏、空閑存儲(chǔ)器訪問等。不支持防止這樣的動(dòng)作的構(gòu)造的現(xiàn)代程序設(shè)計(jì)語言的一個(gè)例子是C或C++程序設(shè)計(jì)語言。當(dāng)編譯以C或C++編寫的程序時(shí),通常未檢測(cè)到諸如以上所指出的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤。
舉例來說,在C/C++內(nèi),開發(fā)者可能定義特定大小的數(shù)組并且然后訪問超過該數(shù)組大小的元素??紤]圖1中所示的代碼實(shí)例。如所示出的,對(duì)a[21]的訪問針對(duì)的不是由程序所分配的存儲(chǔ)器部分,并且因此可能是堆(heap)上未分配的存儲(chǔ)器或者是由另一段程序所分配的存儲(chǔ)器。這樣的動(dòng)作是非法的,但卻通常未被常規(guī)的C/C++編譯器檢測(cè)到。
然而,一些運(yùn)行時(shí)分析工具,例如那些利用目標(biāo)代碼插入(OCI)技術(shù)的工具,可以檢測(cè)這些類別的錯(cuò)誤。OCI是在計(jì)算機(jī)程序的目標(biāo)文件內(nèi)插入校驗(yàn)指令的技術(shù)。具有這種插入其中的校驗(yàn)指令的程序被稱作插裝程序(instrumented program)。校驗(yàn)指令實(shí)現(xiàn)各種有關(guān)存儲(chǔ)器使用的監(jiān)控和/或跟蹤功能。可以在訪問(reference)存儲(chǔ)器的程序指令之間插入校驗(yàn)指令,即監(jiān)控讀取和寫入操作以及存儲(chǔ)器分配和解除分配。
擴(kuò)展與運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的檢測(cè)有關(guān)的運(yùn)行時(shí)分析工具的功能會(huì)是有益的。
發(fā)明內(nèi)容
本文所公開的實(shí)施例提供了與計(jì)算機(jī)程序的運(yùn)行時(shí)存儲(chǔ)器分析有關(guān)的方法和制品(article of manufacture)。本發(fā)明的一個(gè)實(shí)施例可以包括分析計(jì)算機(jī)程序中運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤方法。所述方法可以包括利用運(yùn)行時(shí)分析代碼插裝(instrument)計(jì)算機(jī)程序并且檢測(cè)已插裝的計(jì)算機(jī)程序的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤。響應(yīng)于檢測(cè)運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤,所述方法還可以包括動(dòng)態(tài)地設(shè)置監(jiān)測(cè)點(diǎn)。
本發(fā)明的另一實(shí)施例可以包括分析計(jì)算機(jī)程序中運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的方法,所述方法包括檢測(cè)所述計(jì)算機(jī)程序中的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤、為運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤確定上下文信息,并且將上下文信息與用戶規(guī)定的屬性進(jìn)行比較。如果上下文信息與用戶指定的屬性匹配,則可以為所述計(jì)算機(jī)程序自動(dòng)地設(shè)置監(jiān)測(cè)點(diǎn)。
而本發(fā)明的另一實(shí)施例可以包括機(jī)器可讀存儲(chǔ)器,所述機(jī)器可讀存儲(chǔ)器上具有存儲(chǔ)于其上的多個(gè)使得該機(jī)器執(zhí)行本文所公開的各種步驟和/或功能的代碼區(qū)段。
附圖中示出了目前優(yōu)選的實(shí)施例;然而,應(yīng)當(dāng)理解到本發(fā)明不限于所示出的明確的裝置和手段。
圖1描述了對(duì)理解本文所公開的實(shí)施例有用的示范性源代碼。
圖2是對(duì)理解本文所公開的實(shí)施例有用的示范性源代碼。
圖3是關(guān)于根據(jù)圖2所描述的錯(cuò)誤由運(yùn)行時(shí)分析工具所產(chǎn)生的示例輸出。
圖4是描述依照本發(fā)明的一個(gè)實(shí)施例的運(yùn)行時(shí)存儲(chǔ)器分析方法的流程圖。
具體實(shí)施例方式
盡管本說明書以規(guī)定了被認(rèn)為是新穎的本發(fā)明的特征的權(quán)利要求作為結(jié)論,但是可以認(rèn)為考慮根據(jù)結(jié)合附圖的描述將更好地理解本發(fā)明。如所需的,本文公開了本發(fā)明的具體實(shí)施例;然而,應(yīng)當(dāng)認(rèn)識(shí)到,所公開的實(shí)施例僅是本發(fā)明的示范,其可以以各種形式實(shí)施。因此,不認(rèn)為本文所公開的特定結(jié)構(gòu)的和功能的細(xì)節(jié)是限制,而僅認(rèn)為是用于權(quán)利要求的基本原理以及用于教導(dǎo)本領(lǐng)域的技術(shù)人員以實(shí)際上任何適當(dāng)?shù)木唧w結(jié)構(gòu)來多樣地使用本發(fā)明裝置的代表性基本原理。此外,本文所使用的術(shù)語和慣用語并不打算限制而僅是提供本發(fā)明的可理解的描述。
本文所公開的實(shí)施例提供了用于在計(jì)算機(jī)程序中動(dòng)態(tài)地設(shè)置監(jiān)測(cè)點(diǎn)的技術(shù)。依照本文所公開的發(fā)明裝置,用戶或開發(fā)者可以設(shè)立各種條件。如果條件滿足,就可以動(dòng)態(tài)地創(chuàng)建監(jiān)測(cè)點(diǎn)。此外,當(dāng)滿足設(shè)立的條件并且創(chuàng)建了監(jiān)測(cè)點(diǎn)時(shí)就可以自動(dòng)地執(zhí)行一個(gè)或多個(gè)程序動(dòng)作。
使用軟件分析工具可以實(shí)現(xiàn)本文所描述的各種功能。例如,在一個(gè)實(shí)施例中,可以將本文所描述的各種功能實(shí)現(xiàn)為Rational PurifyPlus系列軟件分析工具的一個(gè)或多個(gè)成員的擴(kuò)展,其中來自紐約阿蒙克(Armonk)的國(guó)際商業(yè)機(jī)器公司(IBM)的Rational PurifyPlus系列軟件分析工具是商業(yè)上可用的。PurifyPlus是為軟件開發(fā)者和測(cè)試者提供運(yùn)行時(shí)分析功能的計(jì)算機(jī)程序系列。一般而言,運(yùn)行時(shí)分析指的是使用在執(zhí)行處于測(cè)試中的程序期間所收集的數(shù)據(jù)來理解應(yīng)用行為的實(shí)踐。使用PurifyPlus可以分析的各種開發(fā)活動(dòng)可以包括、但不限于本機(jī)C/C++應(yīng)用中的存儲(chǔ)器損壞檢測(cè)和存儲(chǔ)器剖析(memory profiling)、Java和.NET管理代碼應(yīng)用中的存儲(chǔ)器剖析、識(shí)別慢的或無效的代碼部分的性能剖析、代碼覆蓋分析以及運(yùn)行時(shí)跟蹤。
本文所公開的產(chǎn)品意圖提供用于教導(dǎo)本領(lǐng)域的技術(shù)人員更好地理解本文所公開的發(fā)明裝置的基本原理。然而,應(yīng)當(dāng)認(rèn)識(shí)到,本發(fā)明可以實(shí)現(xiàn)為獨(dú)立的應(yīng)用、更大的應(yīng)用的一部分或者以實(shí)際上任何適當(dāng)?shù)木唧w結(jié)構(gòu)、計(jì)算機(jī)程序和/或其部分來實(shí)現(xiàn)。
圖2是對(duì)理解本文所公開的實(shí)施例有用的示范性源代碼。使用本文所描述的運(yùn)行時(shí)分析工具來執(zhí)行圖2中所描述的程序會(huì)導(dǎo)致第10行所報(bào)告的“空閑存儲(chǔ)器讀”(FMR)錯(cuò)誤的檢測(cè)。FMR類型的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤指的是數(shù)組在被訪問之前已經(jīng)被釋放的情形。
圖3是關(guān)于根據(jù)圖2所描述的錯(cuò)誤由運(yùn)行時(shí)分析工具所產(chǎn)生的示例輸出。在所提供的關(guān)于運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的上下文信息的不同項(xiàng)目中,該輸出指出了堆棧跟蹤信息。堆棧跟蹤信息指出使用對(duì)源于“calloc”內(nèi)的“malloc”的調(diào)用來分配存儲(chǔ)塊,其中從“main”調(diào)用“calloc”,而從“start”調(diào)用“main”。
依照本發(fā)明的一個(gè)實(shí)施例,該上下文信息可以用于動(dòng)態(tài)地創(chuàng)建和/或設(shè)置監(jiān)測(cè)點(diǎn)。更具體地,該上下文信息可以與用戶規(guī)定的信息,即指令的一個(gè)或多個(gè)屬性進(jìn)行比較。用戶指定的屬性指出動(dòng)態(tài)地創(chuàng)建監(jiān)測(cè)點(diǎn)的環(huán)境。如果上下文信息與用戶指定的屬性匹配,那么可以自動(dòng)地設(shè)置監(jiān)測(cè)點(diǎn)。按照可能由屬性所指定的,可以執(zhí)行另外的一個(gè)或多個(gè)程序動(dòng)作。
監(jiān)測(cè)點(diǎn)指的是能夠指出指定的數(shù)據(jù)或存儲(chǔ)器部分何時(shí)改變的監(jiān)控程序或函數(shù)。例如,Purify中的監(jiān)測(cè)點(diǎn)是通過監(jiān)控程序執(zhí)行時(shí)其進(jìn)行加載和存儲(chǔ)的地址來實(shí)現(xiàn)的。Purify可以報(bào)告有關(guān)讀取、寫入、分配、釋放、進(jìn)入函數(shù)入口范圍以及離開函數(shù)出口范圍的每次存儲(chǔ)器訪問的準(zhǔn)確原因和結(jié)果。
在本發(fā)明的一個(gè)實(shí)施例中,用戶指定的屬性可以包括于運(yùn)行時(shí)分析工具的配置文件內(nèi)。例如,關(guān)于Purify,指令可以包括于指出特定環(huán)境的配置文件內(nèi),在該特定環(huán)境下監(jiān)測(cè)點(diǎn)被自動(dòng)地創(chuàng)建或者視具體情況而被調(diào)用。
這樣的指令的例子可以是watch on error<error type><stack trace><re-start flag>。當(dāng)在Purify的情況下將該指令放入配置文件中的時(shí)候,該指令引起針對(duì)由該指令的參數(shù)所指出的環(huán)境而設(shè)置或調(diào)用監(jiān)測(cè)點(diǎn)。<errortype>屬性指定了會(huì)引起調(diào)用監(jiān)測(cè)點(diǎn)功能的特定類型的存儲(chǔ)器訪問錯(cuò)誤。對(duì)于該屬性來說可以指定的可能的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤可以包括、但不限于空閑存儲(chǔ)器讀錯(cuò)誤、空閑存儲(chǔ)器寫錯(cuò)誤、存儲(chǔ)器泄漏錯(cuò)誤、未初始化存儲(chǔ)器讀錯(cuò)誤、數(shù)組邊界讀錯(cuò)誤、數(shù)組邊界寫錯(cuò)誤等。提供不同類型的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的清單只是為了說明。同樣地,本文所公開的實(shí)施例并不打算受限于所提供的實(shí)例。應(yīng)當(dāng)認(rèn)識(shí)到,OCI工具能夠識(shí)別的任何類型的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤都可以用作error type屬性的可能值。
指令中的下一屬性,<stack trace>屬性可以指定為了調(diào)用監(jiān)測(cè)點(diǎn)而要從運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤檢測(cè)的堆棧跟蹤信息。例如,指令的堆棧跟蹤信息可以指出下次檢測(cè)對(duì)malloc的調(diào)用,其中從calloc調(diào)用malloc,從main調(diào)用calloc,從_start調(diào)用main,假定該指令的其他條件也滿足,則自動(dòng)地設(shè)置監(jiān)測(cè)點(diǎn)。<re-start flag>屬性指定了當(dāng)調(diào)用監(jiān)測(cè)點(diǎn)時(shí)是否要重新啟動(dòng)處于測(cè)試中的程序。在另一實(shí)施例中,可以提供另外的屬性,其指出當(dāng)設(shè)置監(jiān)測(cè)點(diǎn)時(shí)是否要在調(diào)試器以及要使用的特定調(diào)試器中重新啟動(dòng)程序。
因此,當(dāng)檢測(cè)到運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的時(shí)候,可以將從運(yùn)行時(shí)分析工具收集的信息,即根據(jù)圖3所描述的上下文信息,與配置文件中所包括的用戶指定的指令進(jìn)行比較。如果檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的上下文信息與指令的屬性匹配,則可以自動(dòng)地創(chuàng)建對(duì)應(yīng)于匹配指令的監(jiān)測(cè)點(diǎn)。至于Purify運(yùn)行時(shí)分析工具,視具體情況而定,可以將指定了從上下文信息或指令所提取的屬性的指示插入到指示文件(directive file)。如所指出的,處于測(cè)試中的程序依照指令屬性所指定的可選地可以隨或不隨調(diào)試器重新啟動(dòng)。
圖4是說明依照本發(fā)明的一個(gè)實(shí)施例的運(yùn)行時(shí)存儲(chǔ)器分析方法400的流程圖。例如,方法400可以開始于這樣的狀態(tài),即在該狀態(tài)下已將本文所討論的各種指令中的一個(gè)或多個(gè)插入到諸如Purify的運(yùn)行時(shí)分析工具的配置文件。如所指出的,指令的屬性可以指定將要調(diào)用或設(shè)置監(jiān)測(cè)點(diǎn)功能的環(huán)境。
因此,方法400可從步驟402開始,在步驟402中讀取來自配置文件的指令。在步驟405中,基于OCI的運(yùn)行時(shí)分析工具可以利用運(yùn)行時(shí)存儲(chǔ)器分析函數(shù)插裝計(jì)算機(jī)程序。例如,Purify插裝程序以自動(dòng)地將每個(gè)存儲(chǔ)器訪問截取為其動(dòng)態(tài)錯(cuò)誤檢測(cè)的一部分??梢詫?duì)運(yùn)行時(shí)例程的一個(gè)或多個(gè)調(diào)用插入到程序,所述對(duì)運(yùn)行時(shí)例程的一個(gè)或多個(gè)調(diào)用是運(yùn)行時(shí)分析函數(shù)庫(kù)部分,而不是處于測(cè)試中的程序的原始部分。可以在程序內(nèi)包括、但不限于函數(shù)入口和/或出口點(diǎn)的位置插入這些函數(shù)以監(jiān)控本文所描述的各種類型的存儲(chǔ)器訪問。在步驟410中,運(yùn)行時(shí)分析工具可以讀取來自指示文件的任何指示,所述指示文件已由于處于測(cè)試中的計(jì)算機(jī)程序的一次或多次先前的運(yùn)行而被啟用。可以利用已標(biāo)識(shí)的指示實(shí)現(xiàn)存儲(chǔ)器訪問監(jiān)控。
在步驟415中,可以執(zhí)行插裝程序。在步驟420中,可以進(jìn)行關(guān)于是否遇到停止條件的確定。例如,程序可以自然地終止、遇到致命的故障或斷點(diǎn)等。如果沒有遇到停止條件,則該方法可以前進(jìn)到步驟425。在步驟425中,可以進(jìn)行關(guān)于是否遇到運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的確定。如果沒有,則該方法可以返回到步驟415繼續(xù)執(zhí)行。如果檢測(cè)到運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤,則該方法可以前進(jìn)到步驟430。
在步驟430中,可以通過OCI工具來收集上下文信息。例如,可以確定諸如引起運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的功能和/或模塊的信息以及被訪問的特定的存儲(chǔ)器地址。還可以識(shí)別堆棧跟蹤信息以及檢測(cè)的存儲(chǔ)器訪問錯(cuò)誤的類型,所述堆棧跟蹤信息指定了通向造成運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的函數(shù)的調(diào)用鏈。
在步驟435中,可以進(jìn)行關(guān)于檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤是否與配置文件中所指定的一個(gè)或多個(gè)指令的屬性一致的確定。例如,可以在步驟430中所收集的上下文信息和用戶指定指令的一個(gè)或多個(gè)用戶指定的屬性之間進(jìn)行比較。可以在檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的類型和指令中所指定的類型之間、在對(duì)引起運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤有責(zé)任的函數(shù)和指令中所指定的函數(shù)之間、和/或在檢測(cè)到的堆棧跟蹤信息或調(diào)用鏈和指令中所指定的堆棧跟蹤信息或調(diào)用鏈之間進(jìn)行比較。如果檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤與配置文件中的指令之一所指定的屬性一致或匹配,則該方法可以前進(jìn)到步驟440。如果不一致或不匹配,則該方法可以返回到步驟415繼續(xù)執(zhí)行。
應(yīng)當(dāng)認(rèn)識(shí)到,可以從指令中省略本文所討論的有關(guān)指示的一個(gè)或多個(gè)屬性或者將其指定為通配符。例如,開發(fā)者可以省略對(duì)引起運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤有責(zé)任的函數(shù)或者將屬性指定為通配符。無論哪種情況,指令都指出有責(zé)任的函數(shù)與是否觸發(fā)監(jiān)測(cè)點(diǎn)無關(guān)。如果滿足其他參數(shù),則會(huì)動(dòng)態(tài)地設(shè)置監(jiān)測(cè)點(diǎn)而不考慮引起運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的特定函數(shù)。例如,得到的監(jiān)測(cè)點(diǎn)會(huì)監(jiān)控特定類型的存儲(chǔ)器訪問錯(cuò)誤而不考慮觸發(fā)錯(cuò)誤的函數(shù)。類似地,運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的類型可以被忽略或被指定為通配符。在這種情況下,例如,可以識(shí)別如指令所指定的特定函數(shù)和/或調(diào)用鏈所觸發(fā)的任何類別的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤,從而實(shí)現(xiàn)配置的監(jiān)測(cè)點(diǎn)監(jiān)控所指出的函數(shù)的訪問。
總之,在步驟440中,可以動(dòng)態(tài)地設(shè)置或創(chuàng)建監(jiān)測(cè)點(diǎn)。可以將指定了用戶指令的參數(shù)、并且因此指定了上下文信息的指示插入到指示文件。例如,如果指令是“watch_on_error FMM foo;*1”,則該指令指定如果在名為“foo”的函數(shù)中檢測(cè)出空閑存儲(chǔ)器失配(FMM)錯(cuò)誤,則應(yīng)當(dāng)動(dòng)態(tài)地設(shè)置監(jiān)測(cè)點(diǎn)。通配符“*”指出可以從任何地方調(diào)用函數(shù)“foo”。屬性“1”指示將使用可以由開發(fā)者在其它地方指定的特定調(diào)試器來重新啟動(dòng)程序。得到的可以被插入到指示文件的監(jiān)測(cè)點(diǎn)命令或指示可以采取purify_watch_n(<address-of-array>,<size-of-array>,“rw”)的形式,該形式告訴運(yùn)行時(shí)分析工具在用于任何的讀、寫和/或自由訪問的地址監(jiān)視存儲(chǔ)器。
因此,在步驟445中,可以自動(dòng)地執(zhí)行指令中指定的一個(gè)或多個(gè)程序動(dòng)作。例如,如果指令中指定了的話則可以自動(dòng)地重新啟動(dòng)程序。另外,如果指令這樣指出了,則可以在用戶指定的調(diào)試器內(nèi)重新啟動(dòng)程序。也就是說,可以自動(dòng)地運(yùn)行調(diào)試器并且可以自動(dòng)地加載和執(zhí)行程序。
當(dāng)程序重新啟動(dòng)的時(shí)候,最近創(chuàng)建的監(jiān)測(cè)點(diǎn)成為有效的并且監(jiān)控對(duì)目標(biāo)存儲(chǔ)器位置的和/或通過目標(biāo)函數(shù)的存儲(chǔ)器訪問??梢詾檫M(jìn)一步的分析收集并且存儲(chǔ)運(yùn)行時(shí)存儲(chǔ)器訪問信息和/或以別的方式使其對(duì)于用戶可用。
本文所公開的方法描述了本發(fā)明的一個(gè)實(shí)施例,并且同樣地,其不打算以任何的方式來限制本發(fā)明。本發(fā)明的其它實(shí)施例,如可以由本領(lǐng)域的技術(shù)人員所設(shè)想的也在本發(fā)明的范圍之內(nèi)。作為一個(gè)例子,諸如多線程、面向?qū)ο蟮某绦蛟O(shè)計(jì)等程序設(shè)計(jì)習(xí)慣的應(yīng)用可能導(dǎo)致不同的步驟以不同于所提供的次序而被并發(fā)地執(zhí)行,或者以一些其它的方式而被改變。然而,這樣的差異并不背離本發(fā)明的精神。
可以以硬件、軟件或者硬件和軟件的結(jié)合來實(shí)現(xiàn)本發(fā)明??梢栽谝粋€(gè)計(jì)算機(jī)系統(tǒng)中以集中式的方式或者在不同的元件分散于幾個(gè)互連的計(jì)算機(jī)系統(tǒng)的情況下以分布式的方式來實(shí)現(xiàn)本發(fā)明。適于實(shí)現(xiàn)本文所描述的方法的任何類型的計(jì)算機(jī)系統(tǒng)或其它的裝置都是適合的。硬件和軟件的典型的結(jié)合可以是具有計(jì)算機(jī)程序的通用計(jì)算機(jī)系統(tǒng),當(dāng)加載和執(zhí)行該計(jì)算機(jī)程序的時(shí)候,其控制計(jì)算機(jī)系統(tǒng)從而使得該計(jì)算機(jī)系統(tǒng)實(shí)現(xiàn)本文所描述的方法。還可以將本發(fā)明嵌入到計(jì)算機(jī)程序產(chǎn)品中,其包括能實(shí)現(xiàn)本文所描述的方法的全部特征,并且當(dāng)加載到計(jì)算機(jī)系統(tǒng)的時(shí)候其能夠?qū)崿F(xiàn)這些方法。
在當(dāng)前上下文中,術(shù)語“計(jì)算機(jī)程序”、“軟件”、“應(yīng)用”、其變型和/或組合,表示這樣一組指令以任何語言、代碼或符號(hào)的任何表達(dá),即該組指令想要使得具有信息處理能力的系統(tǒng)直接地或者在下述其一或二者之后執(zhí)行特定的功能a)轉(zhuǎn)換成另一種語言、代碼或符號(hào);b)以不同材料的形式再現(xiàn)。例如,計(jì)算機(jī)程序可以包括、但不限于子例程、函數(shù)、過程、對(duì)象方法、對(duì)象實(shí)現(xiàn)、可執(zhí)行應(yīng)用、小應(yīng)用程序、小服務(wù)程序、源代碼、目標(biāo)代碼、共享庫(kù)/動(dòng)態(tài)負(fù)載庫(kù)和/或設(shè)計(jì)用于在計(jì)算機(jī)系統(tǒng)上執(zhí)行的其它指令序列。
術(shù)語“一”和“一個(gè)”,如本文所使用的,被定義為一個(gè)或多于一個(gè)。術(shù)語“多個(gè)”,如本文所使用的,被定義為兩個(gè)或多于兩個(gè)。術(shù)語“另一個(gè)”,如本文所使用的,被定義為至少第二個(gè)或更多。術(shù)語“包含”和/或“具有”,如本文所使用的,被定義為包括(即開放語言)。術(shù)語“連接”,如本文所使用的,盡管不一定直接連接,也不一定機(jī)械連接,但仍被定義為連接,即通過通信通道或路徑或另一組件或系統(tǒng)進(jìn)行通信鏈接。
可以以其它的形式實(shí)施本發(fā)明而不背離本發(fā)明的精神或?qū)嵸|(zhì)屬性。因此,當(dāng)指出本發(fā)明的范圍的時(shí)候,應(yīng)當(dāng)參考下面的權(quán)利要求,而不是前述的說明書。
權(quán)利要求
1.一種分析計(jì)算機(jī)程序中運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的方法,所述方法包括利用運(yùn)行時(shí)分析代碼插裝所述計(jì)算機(jī)程序;檢測(cè)所述已插裝的計(jì)算機(jī)程序的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤;以及響應(yīng)于檢測(cè)所述運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤,動(dòng)態(tài)地設(shè)置監(jiān)測(cè)點(diǎn)。
2.根據(jù)權(quán)利要求1的方法,所述檢測(cè)步驟進(jìn)一步包括為所述運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤確定上下文信息;以及將所述上下文信息與用戶指定的屬性進(jìn)行比較。
3.根據(jù)權(quán)利要求2的方法,所述動(dòng)態(tài)地設(shè)置步驟進(jìn)一步包括根據(jù)、至少部分地根據(jù)所述比較步驟選擇性地設(shè)置所述監(jiān)測(cè)點(diǎn)。
4.根據(jù)權(quán)利要求2的方法,其中,所述上下文信息包括一類檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤并且所述屬性包括用戶指定類型的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤,所述比較步驟進(jìn)一步包括將檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的類型與用戶指定的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的類型進(jìn)行比較。
5.根據(jù)權(quán)利要求2的方法,其中,所述上下文信息包括用于檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的堆棧跟蹤信息并且所述屬性包括用戶指定的堆棧跟蹤信息,所述比較步驟進(jìn)一步包括將用于檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的堆棧跟蹤信息與用戶指定的堆棧跟蹤信息進(jìn)行比較。
6.根據(jù)權(quán)利要求1的方法,其進(jìn)一步包括選擇性地重新啟動(dòng)所述具有啟用的監(jiān)測(cè)點(diǎn)的已插裝的計(jì)算機(jī)程序。
7.根據(jù)權(quán)利要求1的方法,其進(jìn)一步包括利用調(diào)試器來選擇性地重新啟動(dòng)所述具有啟用的監(jiān)測(cè)點(diǎn)的已插裝的計(jì)算機(jī)程序。
8.一種分析計(jì)算機(jī)程序中運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的方法,所述方法包括檢測(cè)計(jì)算機(jī)程序中的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤;為所述運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤確定上下文信息;將所述上下文信息與用戶指定的屬性進(jìn)行比較;以及如果所述上下文信息與用戶指定的屬性匹配,則為所述計(jì)算機(jī)程序動(dòng)態(tài)地設(shè)置監(jiān)測(cè)點(diǎn)。
9.根據(jù)權(quán)利要求8的方法,其中,所述上下文信息包括一類檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤并且所述屬性指定了用戶指定類型的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤,所述比較步驟進(jìn)一步包括將檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的類型與用戶指定的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的類型進(jìn)行比較。
10.根據(jù)權(quán)利要求8的方法,其中,所述上下文信息包括用于檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的堆棧跟蹤信息并且所述屬性指定了用戶指定的堆棧跟蹤信息,所述比較步驟進(jìn)一步包括將用于所述檢測(cè)到的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的堆棧跟蹤信息與所述用戶指定的堆棧跟蹤信息進(jìn)行比較。
11.根據(jù)權(quán)利要求8的方法,其進(jìn)一步包括選擇性地重新啟動(dòng)具有啟用的監(jiān)測(cè)點(diǎn)的已插裝的計(jì)算機(jī)程序。
12.根據(jù)權(quán)利要求8的方法,其進(jìn)一步包括利用調(diào)試器來選擇性地重新啟動(dòng)具有啟用的監(jiān)測(cè)點(diǎn)的已插裝的計(jì)算機(jī)程序。
13.根據(jù)權(quán)利要求8的方法,其進(jìn)一步包括利用運(yùn)行時(shí)分析代碼插裝所述計(jì)算機(jī)程序。
14.一種包括用于實(shí)現(xiàn)前述方法權(quán)利要求中任何一項(xiàng)所述的方法的裝置的系統(tǒng)。
全文摘要
一種分析計(jì)算機(jī)程序中運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤的方法,該方法可以包括利用運(yùn)行時(shí)分析代碼插裝所述計(jì)算機(jī)程序并且檢測(cè)已插裝的計(jì)算機(jī)程序的運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤。響應(yīng)于檢測(cè)所述運(yùn)行時(shí)存儲(chǔ)器訪問錯(cuò)誤,該方法還可以包括動(dòng)態(tài)地設(shè)置監(jiān)測(cè)點(diǎn)。
文檔編號(hào)G06F11/36GK1991785SQ20061014702
公開日2007年7月4日 申請(qǐng)日期2006年11月13日 優(yōu)先權(quán)日2005年12月27日
發(fā)明者T·沃拉 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司