嵌入式軟體調試與驗證3動態時態斷言

来源:https://www.cnblogs.com/testing-/archive/2023/09/25/17725668.html
-Advertisement-
Play Games

重點:find 、ps 、grep 、管道 1、du 指令 作用:du表示directory used,顯示出目錄所占的磁碟空間大小的情況。 語法:#du -sh 目錄路徑 選項說明: -s:表示sumary,彙總統計 -h:表示以較高可讀性的形式顯示 案例:使用du指令統計出“/home”的大小情 ...


3 使用動態時態斷言進行調試

3.1 引言

軟體產業發展迅速,程式規模越來越大。相比之下,調試文獻的進展卻相對緩慢。大多數調試器只適用於某一類或某一組錯誤。程式錯誤可能是由多種情況造成的,併在其根本原因出現很久之後才被髮現。瞭解源代碼和程式的執行行為對於定位和找到大多數錯誤的原因至關重要。這種理解可以通過不同的方式來實現;一種方式是採用不同的調試程式,捕捉、描繪、分析和研究程式在不同執行點和執行點之間的狀態。

典型的互動式源代碼級調試器是最有價值的調試工具之一,但它在很大程度上依賴於用戶進行實時調查的能力。它可以幫助程式員定位並找到錯誤的根本原因,具體方法是逐步瀏覽源代碼並檢查當前的執行狀態。

源代碼級調試技術(如條件斷點和觀察點)可在調試會話期間動態插入。它們可以檢查執行屬性,併在滿足條件時停止執行。儘管這些斷點具有條件性和動態性的優勢,可以隨時插入、刪除和修改,但它們仍然受其位置的限制;目標程式源代碼中的確切行號,以及執行時該位置上引用變數和對象的當前狀態。例如,類變數可能在一個方法中被分配了壞值,而當導致崩潰或核心轉儲的錯誤被揭示時,該方法並不在堆棧中。這可能會迫使用戶對同一錯誤運行多個調試會話,然後才能理解該錯誤。通常情況下,用戶可以調查當前狀態。如果沒有證據表明錯誤的根本原因,他/她可能會重新開始執行,希望能停在一個較早的點上,在那裡仍然可以找到錯誤的原因。相比之下,時態斷言是一種使用時態邏輯(TL)的邏輯表達式,目的不是驗證一種狀態,而是驗證一連串的執行狀態,如代碼塊內變數值變化的序列。

為了在傳統的源代碼級調試會話中引入動態時態斷言(Dynamic Temporal Assertions,DTA),本研究對名為UDB的源代碼級調試器進行了擴展,增加了實時時態斷言(在實時調試會話中生成)。UDB是Unicon編程語言的源代碼級調試器;它與 Source Forge 上的Unicon語言發行版一起打包,也可從unicon.org下載。除了時態斷言擴展外,UDB的命令集與GDB相同。本研究之所以使用UDB而不是GDB,是因為UDB具有更高層次的執行監控抽象,比GDB更容易擴展。

UDB 支持的新 DTA 斷言不受普通斷點的限制,如局部性和時間性。UDB 的 DTA 斷言有三個目的:

1.擴展傳統源代碼級調試器的條件斷點和觀察點的可用性。這簡化了驗證關係的能力,這些關係可能會延伸到整個執行過程,並檢查評估狀態之外的信息。

2.減少用戶為進行基於狀態的調查而不得不停止和單步執行的次數。

3.通過測試和驗證功能來增強傳統的基於斷點的調試會話。

在兩個實時程式上進行時態斷言的可能性:

兩個同級程式的時間斷言的可能性:

3.1.1 DTA斷言與普通斷言

在源代碼中插入標準的代碼內斷言是為了驗證前置和後置條件或檢查某些變數和表達式的值。一般來說,典型的普通斷言有三個局限性:

  • 位置性

普通的代碼內斷言受其位置(作用域)的限制;即使根據當前的執行狀態,它是有效的,也不能引用其他作用域的變數。斷言存在於函數中;每個斷言都可以引用局部變數和全局變數。如果作用域是方法,它可以引用任何類變數。事實上,典型的斷言無法檢查或驗證其他函數或方法中的局部變數,即使該外來局部變數是靜態的,或者仍然存在於當前程式執行狀態的堆棧中。例如,如果用戶需要檢查存儲過程foo()中變數x的值與存儲過程bar()中變數y的值,該怎麼辦?

  • 時間性

普通的代碼內斷言受當前執行狀態的限制。它只能檢查引用變數的當前值。例如,如果用戶需要檢查變數x的值與x之前甚至初始值的比較,該怎麼辦?普通斷言就會再次失去作用。

  • 動態性

普通的代碼內斷言僅限於源代碼,它是在源代碼中編寫和編譯的;任何更改或修改都需要重新編譯和重建可執行文件。如果普通斷言評估為假,它可能會提供警告語句或終止執行。如果用戶想進行調查,可以通過收緊或放寬條件或添加附近的斷言來修改斷言。

3.1.2 DTA斷言與條件斷點

條件斷點和觀察點是在調試過程中動態插入的。它們可以檢查執行屬性,併在滿足條件時停止執行。儘管這類斷點具有條件性和動態性的優勢,可以隨時插入、刪除和修改,但它們仍然受其位置的限制,即目標程式源代碼中的確切行號,以及執行時該位置上引用變數和對象的當前狀態。而 DTA 斷言可以引用在評估時不可訪問(在當前執行狀態下不活動)的變數。這一特性解決了圖 3.2 所提供的問題,該圖顯示過程 foo() 和 bar() 是 baz() 的同級變數。

3.2 使用DTA斷言進行調試

一般來說,源代碼級調試器的用戶會遇到以下問題:

  1. 提供的執行歷史信息有限,而且

  2. 缺乏自動跟蹤和分析調試技術,而這些技術可以幫助用戶驗證各種執行狀態。

在典型的源代碼級調試器中,DTA斷言提供了條件斷點和觀察點的擴展。它們採用實現時態邏輯運算符的代理,每個代理都有自動跟蹤機制。跟蹤數據由斷言驅動;實時收集和分析相關信息。不同的DTA斷言可以動態、靈活地應用於不同的執行屬性。每個斷言都能驗證程式屬性,這些屬性可能會擴展到一系列執行狀態。下圖使用時態斷言檢查不同作用域的變數:

例如,調試過程可能包括檢查不同作用域的變數值。程式main()調用isPrime(),當傳遞的參數是一個質數時,它返回true。上圖中提供的時間斷言說明瞭如何將變數i的當前本地值與存儲過程main()中變數i的最後值(用 main:i 表示)進行比較。該DTA斷言假定參數i的值在isPrime()執行期間不會改變。然而,由於程式正在修改i的值,因此在isPrime()函數中每次改變i的值(時間狀態)時,該斷言的值都會變為false,並且在每次從isPrime()函數返回時(時間間隔),該斷言的值都會變為false。

下圖:時態斷言:範圍和時間間隔

3.3 設計

DTA斷言並不取代傳統的斷點或觀察點,相反,它們提供了一種減少斷點或觀察點數量的技術,這意味著它們可用於減少執行停止的次數,並改善整個調查過程。這些時態斷言通過時態邏輯運算符代理(時態代理)推進斷點。在停止執行時,除了源代碼級調試功能外,用戶還可以刪除、啟用、禁用和修改現有斷言,甚至在有錯誤的程式源代碼中的任何位置插入新的 DTA 斷言;所有這一切都無需重新編譯目標程式源代碼或將其重新載入到調試器中。

UDB 支持三種DTA斷言。每種類型都有自己的時態代理集。所有這些DTA都可以引用執行屬性和其他內部擴展代理。

表 3.1 原子數據相關代理

表 3.2 原子執行行為相關代理

3.3.1 過去時DTA斷言

這類斷言包括四個過去時間操作符。這些操作符利用在進入斷言作用域和到達斷言源代碼位置之間保留的信息。在插入時,調試器開始保留相關信息,以便在斷言評估過程中使用。當執行到達虛擬執行點(斷言在錯誤程式空間中的掛鉤位置)時,將對斷言時間間隔進行評估。如果由於某些信息缺失(可能在斷言生命周期內從未使用過超出範圍的引用數據)而導致評估無法完成,則斷言評估會被標記為無效。這四個DTA斷言是

  1. alwaysp() {expr}:斷言一個表達式在每個時態、時態間隔和整個執行過程中必須始終成立(評估為 true)。

  2. sometimep() {expr}:斷言表達式必須在每個時間間隔和整個執行過程中至少成立一次。

  3. previous() {expr}:斷言表達式必須在時間間隔結束前的最後一個狀態成立。

  4. since() {condition ==> expr}:斷言表達式必須在條件為真後一直到時間間隔結束,以及在每個時間間隔內都必須成立。

3.3.2 未來時DTA斷言

這類斷言包括四個未來時間操作符。這些操作符利用在到達斷言源代碼位置和離開斷言範圍之間保留的信息。這些操作符的代理在評估觸發時開始監視引用對象,調試器開始保留相關信息,直到斷言的時間間隔評估完畢。如果執行在斷言的時間間隔結束前終止,用戶可以檢查未完成的時間間隔中的時間狀態。這四個 DTA 斷言是

  1. alwaysf() {expr}:斷言表達式必須在每個狀態、時間間隔和整個執行過程中始終成立(求值為 true)。

  2. sometimef() {expr}:斷言表達式必須在每個時間間隔和整個執行過程中至少成立一次。

  3. next() {expr}:斷言表達式必須在時間間隔的第一個狀態成立。

  4. until() {condition ==> expr}:斷言表達式必須從時間間隔開始一直到條件為真或時間間隔結束,且在每個時間間隔內都必須成立。

3.3.3 全時 DTA 斷言

這類斷言包括兩個全時運算符。這兩個操作符基於進入斷言作用域和退出斷言作用域之間的時間間隔。當進入斷言範圍時,斷言開始保留相關信息並評估其時間狀態。當執行退出斷言範圍時,將對斷言的時間間隔進行評估。這兩個 DTA 斷言是

  1. always() {expr}:斷言表達式必須在每個狀態、時間間隔和整個執行過程中始終成立(評估為 true)。

  2. sometime() {expr}:斷言表達式必須在每個時間間隔和整個執行過程中至少成立一次。

3.4 斷言的評估

每個已達成(已評估)的斷言至少有一個時間間隔。時間間隔由一系列時間狀態組成。時間間隔由斷言範圍和種類定義。斷言的範圍是根據斷言命令中提供的源代碼位置定義的。該範圍是圍繞斷言位置的過程或方法。上圖顯示了所有三種時態斷言的時間間隔,它們都與所提供的位置有關。斷言的作用域和種類共同定義了時間間隔。尤其是過去時DTA斷言的時間間隔始於進入斷言的作用域(調用作用域過程),止於進入作用域後第一次到達斷言的源代碼位置。

未來時間DTA斷言的時間間隔始於進入斷言作用域後第一次到達斷言的源代碼位置,止於退出斷言作用域(從作用域過程返回)。在這種時間斷言中,在時間間隔結束之前,源代碼位置可能會被擊中不止一次。

全時DTA斷言的時間間隔從進入斷言作用域開始,到退出該作用域結束;與所提供的源代碼位置無關。
在調試會話期間,用戶有可能擁有多個斷言,每個斷言有多個時間間隔,每個時間間隔有多個時間狀態。參見下圖。每個 DTA 斷言都要經過三級評估:

  1. 基於狀態:時間層(單一狀態變化)。該評估由斷言引用對象的任何變化觸發。

  2. 基於時間間隔:連續狀態序列。當斷言的時間間隔結束時(退出斷言範圍),就會觸發評估。

  3. 基於整體執行:一系列連續的時間間隔。該評估由執行結束觸發。

時態斷言評估示例:

斷言被命中 t 次 [ $$H_1$$..$$H_t$$ ]。每次命中代表一個時間間隔,該時間間隔由不同數量的狀態組成;每個狀態都被評估為"True"或 "False"。每個"時間區間"的評估都是基於其基於狀態的評估的連接正則表達式(在該特定命中$H_i$$ 上)。最後,在整體時間層面上,根據之前所有基於時間間隔的評估的連接正則形式,再次對斷言進行評估。下圖是調試過程中對各種時態斷言(n 個 DTA 斷言)的評估示例:

UDB的DTA斷言在調試器端進行評估。預設情況下,只要斷言評估為假,源代碼級調試器就會以類似於斷點的方式停止執行。調試器通過評估摘要將控制權移交給用戶。

3.4.1 時間周期和限制

時序周期定義了連續時序間隔的最大次數(時序級評估時間的最大次數),它定義了整體評估。周期的預設值為無限次評估。時間限制定義了每個時間間隔中考慮的時間狀態的最大數量。時間限制的定義會根據參考的時間斷言類型而改變。特別是

  1. 在過去時 DTA 斷言中:限制定義了到達斷言源代碼位置之前和進入斷言範圍之後的最大連續狀態數。

  2. 在 Future-Time DTA 斷言中:limit 定義了到達斷言源代碼位置後和退出斷言範圍前的最大連續狀態數。

  3. 在全時 DTA 斷言中:limit 定義了斷言的源代碼位置達到之前和之後在斷言範圍內的最大狀態數。

預設限制由斷言作用域執行期間遇到的任何時間狀態(時間間隔)定義,並基於其時間間隔。用戶可以使用limit命令設置該限制,從而減少每個時間間隔內考慮的時間狀態數量。

3.4.2 評估日誌

此外,斷言日誌使用戶能夠查看每個斷言的評估行為(評估歷史)。調試器為每個斷言維護一個哈希表。它將斷言的時間間隔映射到列表中,列表中包含了斷言的時間狀態基礎評估信息。每個列表反映一個時態區間,其中保留了每個時態的評估順序和結果。每個列表反映一個時態區間,也根據其順序進行維護。已完成評估的時間間隔會被標記為"True"或 "False"。如果評估過程已經開始,但最終結果仍未完成,或許還未到達時間間隔的終點,則這些時間間隔會標記為 "待定",直到完成為止。這將把 "待定 "轉換為 "True"或 "False"。不過,有些斷言可能永遠不會被觸發進行評估;出現這種情況的原因可能是在特定運行期間,執行從未達到斷言的插入點。這些斷言的命中計數器設置為零。

參考資料

3.4.3 DTA斷言和原子代理

原子代理是一種特殊的擴展代理(非時態邏輯代理)。它們擴展了DTA斷言的可用性,有助於驗證不同執行狀態下更具體的數據和行為關係(見表 3.1 和 3.2)。在 DTA 斷言中使用原子代理時,原子代理會保留和處理數據,並觀察與所用斷言相關的行為。斷言範圍決定了代理何時開始工作,以及它能保留和處理的數據範圍。例如,如果斷言使用了max(var)或min(var)原子代理,代理就會在斷言時間間隔內始終分別保留最大值或最小值。

這些原子代理為DTA斷言及其基本時態邏輯運算符的實用性增加了更多的先進性和靈活性。特別是,引用原子代理的DTA斷言可以輕鬆檢查和比較這些原子代理獲得的數據,這些原子代理封裝了簡單的數據處理,如查找最小值、最大值、總和、變化次數或平均值。例如,假設一個靜態變數根據一個條件語句發生變化,當條件為真時,該變數遞增,當條件失敗時,該變數遞減。如果用戶對該變數達到新的最大值或最小值的時間點感興趣,該怎麼辦?DTA斷言為這種情況提供了一個簡單的解決方案。

不同UDB的時間斷言示例

例如,當變數x變為大於或等於y 時,斷言1將暫停執行。又如,假設用戶對無限遞歸背後的原因感興趣;也許遞歸函數中的一個關鍵參數沒有變化。DTA斷言提供了一種機制,可以保留上次調用的參數值,並將其與當前調用的值進行比較,見斷言 2。如果 old(x) == current(x),斷言將停止執行,並將控制權交給調試器,用戶可以在調試器中進行進一步調查。當然,還有其他原因可能導致無限遞歸,例如連續調用時關鍵參數值的變化方向相反。

此外,DTA斷言簡化了在函數返回值和迴圈迭代次數等程式屬性上插入斷言的過程。例如,用戶可以在函數內部插入一個斷點,以調查函數的返回值,或對返回表達式的值進行代碼內斷言。DTA斷言提供了一種更簡單的機制;參見第 3 號斷言。第4個斷言指出,文件test.icn中第50行的while迴圈總是迭代少於100次。最後斷言5顯示瞭如何對函數的調用次數設置DTA斷言;該斷言將在調用次數為1000時停止執行。使用傳統的源代碼級調試功能(如斷點和觀察點)很難實現這一特殊斷言。

3.5 實現

DTA斷言實際上是在源代碼級調試過程中即時插入到有錯誤的程式源代碼中的。UDB的靜態信息用於協助用戶並檢查插入斷言的語法和語義。每個斷言都與兩組信息(1)基於事件的信息和(2)基於狀態的信息相關聯。調試器會在插入時自動分析每個斷言,以確定每組信息。它能找到在評估過程中需要遇到的代理類型。如果使用了任何擴展代理,調試器會建立該代理的實例,並將其與相關對象關聯。

UDB在Unicon虛擬機中對事件掩碼和事件值的使用

主機調試器維護一個哈希表,將每個斷言源代碼位置映射到其相關對象(代理)。斷言對象負責維護和評估其斷言。它包含的信息有:(1) 已解析的斷言;(2) 所有引用變數的列表;(3) 包含所有時間間隔及其時間狀態的列表;(4) 斷言事件掩碼:對每個斷言進行監控的一組事件代碼;該事件掩碼包括任何引用代理的事件掩碼。執行事件是實時獲取和分析的。一些事件用於控制執行,而另一些事件則用於獲取信息,以支持基於狀態的技術。

每個斷言都有自己的事件和值掩碼,這些掩碼是根據斷言自動構建的,見上圖。所有啟用的斷言事件掩碼的聯合集與調試核心事件掩碼統一。其結果是調試核心在錯誤程式執行過程中請求的事件集。每當斷言被添加、刪除、啟用或禁用時,這組事件就會被重新計算。同時UDB的調試核心會開始向錯誤程式詢問這組新事件。任何斷言事件掩碼的改變都會改變調試核心轉發給該斷言對象的事件集。時態邏輯代理會自動獲取錯誤程式的狀態信息,以評估DTA斷言。每個代理都會自動觀察斷言引用變數,並將其信息保留在調試器空間中。

3.6 評估

DTA 斷言提供了驗證關係的能力,這些關係可能會延伸至整個執行過程,並檢查當前評估狀態之外的信息。DTA 斷言的時間邏輯運算符是內部代理。這些代理可以引用其他原子代理,從而訪問有價值的執行數據和行為信息。UDB 的 DTA 斷言具有以下功能:

  • 動態插入、刪除、啟用、禁用和修改。斷言可在調試過程中即時管理,無需修改源代碼或可執行代碼。

  • 無斷言源代碼支持的非破壞性編程方式。一般來說,只有在程式開發、測試、驗證、確認和調試過程中才需要調試信息。

  • 斷言實際上是作為錯誤程式源代碼的一部分插入和評估的。所有斷言都存在於調試會話配置中;每個斷言都由調試器在調試器執行空間中進行評估。調試器自動維護基於狀態的技術,以確定評估每個斷言所需的信息,並使用基於事件的技術來確定何時何地觸發每個斷言的評估過程。一些基於程式狀態的信息是在斷言評估前收集的,而其他信息則是在評估過程中獲取的。所有 DTA 斷言都將作為目標程式空間的一部分進行評估。

  • 可選的評估套件,用戶可指定評估操作,如停止、顯示和隱藏。顯示操作通過列印語句豐富了斷言的代碼內跟蹤和調試功能,用戶可確保評估已達到某些點,且引用變數滿足條件。

  • 記錄斷言評估結果的功能。這樣,用戶就能查看特定運行的斷言評估歷史。已評估的斷言會以"True"或 "False"標記。某些 DTA斷言可能會在未來引用數據;這些斷言會在基於狀態的精確評估中標記為 "無效"。斷言的間隔標記有計數器,用於跟蹤其執行順序。如果某個斷言從未被執行過,則用其計數器值來區分,在這種情況下計數器值為零。不同運行的日誌比較將在今後的工作中考慮。
    最重要的是DTA斷言可以超出插入位置的範圍。每個斷言都可以引用在以前的狀態中存在,但在評估點不存在的變數或對象,而且每個斷言都可以將以前的變數值與當前或未來的值進行比較。每個DTA斷言都隱含地使用各種代理來跟蹤引用對象,並保留其相關狀態信息,以便在評估時使用。

3.6.1 性能

考慮到時間方面的性能,時態斷言的實現採用了保守的基於斷言的事件驅動跟蹤技術。它只監控相關事件;事件掩碼和值掩碼在插入時為每個斷言自動生成。時間斷言的評估分為三個層次。首先是基於狀態的級別,它取決於所引用的執行屬性的任何變化。第二級是基於時間間隔的級別,由斷言範圍和種類決定。第三層是整體評估層,每次執行都會進行一次評估。不同的斷言可以引用不同的執行屬性。因此,各種斷言的成本會有所不同。

為了瞭解時態斷言對目標程式的執行和調試時間的影響,我們在一個簡單的程式中應用了一個簡單的時態斷言。程式列印 1 到 100,000 之間的數字;見圖 3.9。該時間斷言使用了不同大小的時間間隔。這些時間間隔的大小分別為 1、100、1000、10000、50000 和 100000。實驗基於八種運行,每種運行觀察五次,並報告這些時間的平均值。這些運行類型包括測量獨立模式(不涉及監控)下的程式時間、UDB 監控下未應用斷言的程式時間,以及帶有不同時間間隔的斷言的程式時間。上圖顯示了這些時間斷言對執行時間的影響。

3.7 挑戰與未來工作

與典型斷言、條件斷點和觀察點相比,使用DTA斷言進行調試更具優勢。與此同時,它也面臨著一些挑戰和限制,其中一些挑戰和限制是基於斷言與可執行源代碼的關聯、在調試器中評估斷言,以及源代碼級調試器以合理的性能獲取和保留基於事件和狀態的相關信息的能力。

首先,如果斷言引用了在斷言作用域內無法訪問的變數,調試器應自動跟蹤這些變數並保留其相關狀態信息,以便在斷言評估時使用。這樣DTA斷言就可以訪問在斷言評估時不存在的數據。
其次,如果斷言源代碼位置與語句重疊怎麼辦?應該先評估斷言還是語句?保守的做法是,只有當語句中沒有斷言引用的變數,或者語句沒有賦值給任何斷言引用的變數時,才考慮在語句之後評估斷言。但是,如果語句將賦值給任何斷言引用的變數,則可以在語句評估之前和之後對斷言進行評估。如果兩次評估結果不同,如一個為真,另一個為假,或兩個都為假,斷言將停止執行,並將控制權交給調試器和用戶進行調查。本文介紹的工作採用了最簡單的方法,即在語句之前評估斷言。此外,如果斷言沒有與可執行語句重疊,AlamoDE框架就無法報告非可執行行的行號事件。只有當該行號中的語句被獲取並執行時,才會報告行號事件。在確認斷言已成功插入之前,通過檢查斷言源代碼位置來實現這一點。它還會檢查行號是否為空或是否已註釋。

最後,如果引用的變數是對象或數據結構(如列表),這可能會導致兩個問題。首先,由於別名關係,該對象會在其他名稱下發生變化。其次,如果對象是本地的,它可能會在評估時間之前被垃圾回收器處理掉。我們可以擴展這種實現方式,以實現捕獲變數,從而觀察結構中的某個元素,或者利用別名跟蹤機制來保留所有可能以不同名稱發生的變化。本文介紹的時態斷言的實現並沒有涉及堆變數,這將留待今後工作中解決。

3.8 小結

DTA斷言將C/C++、Java和C#等主流語言中的代碼內斷言技術的擴展版本引入源代碼級調試會話。這些時態斷言可幫助用戶測試和驗證不同執行狀態下的不同關係。此外,斷言評估操作(如 show)提供了在源代碼級調試會話中使用列印語句進行調試和跟蹤的感覺。它們讓用戶有機會知道執行已達到該點,斷言表達式已評估為真;它還讓用戶有能力中斷和停止執行,以便進行更多調查。記錄斷言評估結果的功能可讓用戶查看評估過程。用戶可以查看彙總結果,瞭解哪些出錯,哪些正常。

源代碼級調試器可通過不同的斷點和觀察點有條件地停止執行。在每次停止時,用戶將通過瀏覽調用堆棧和變數值手動調查執行情況。源代碼級調試器要求用戶對錯誤提出假設,並讓用戶通過斷點、觀察點、單步和列印來手動研究這些假設。相比之下,DTA 斷言要求用戶提出邏輯表達式,斷言與錯誤暴露行為相關的執行屬性,調試器將驗證這些斷言。斷言表達式可以引用不同執行狀態、範圍和不同時間間隔的執行屬性。此外,與只評估當前狀態的條件斷點和觀察點不同,DTA 斷言能夠引用在評估時無法訪問的變數(在當前執行狀態下不活動)。

DTA斷言並不能取代傳統的斷點或觀察點,但它提供了一種減少斷點或觀察點數量並改進整個調查過程的技術。DTA斷言減少了人工調查執行狀態的工作量,例如減少了錯誤程式停止調查的次數。

最後,利用時態斷言進行調試並非新鮮事。2002年,Jozsef Kovacs等人將時態斷言集成到並行調試器中,用於調試並行程式。2005 年,Volker Stolz 等人在 AspectJ pointcuts 上使用LTL來驗證程式執行過程中由方面觸發的屬性。2008 年,Cemal Yilmaz等人提出了一種使用時間譜作為程式執行抽象的自動故障定位技術。然而,就我們所知,我們是第一個將典型源代碼級調試器的條件斷點和觀察點功能與基於時態斷言的命令進行擴展的人,這些命令捕捉並驗證了一系列執行狀態(時態和時態間隔)。此外,這些斷言還可以引用範圍外變數,這些變數在評估時可能不在執行狀態中。

釘釘或微信號: pythontesting 微信公眾號:pythontesting
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄1 定義錯誤碼類2 定義業務異常類3 全局異常處理器4 使用5 前端請求效果總結 1 定義錯誤碼類 ​ 可以定義各種錯誤碼枚舉,比如業務,系統相關的報錯信息 /** * 錯誤代碼 * 錯誤碼 * * @author leovany * @date 2023/09/23 */ public enu ...
  • 掛起與恢復進程是指暫停或恢復進程的工作狀態,以達到一定的控制和管理效果。在 Windows 操作系統中,可以使用系統提供的函數實現進程的掛起和恢復,以達到對進程的控制和調度。需要註意,過度使用進程掛起/恢復操作可能會造成系統性能的降低,導致死鎖等問題,因此在使用時應該謹慎而慎重。同時,通過和其他進程... ...
  • strimzi是個CNCF項目,功能是用於在kubernetes環境下部署和配置kafka,並提供了豐富的擴展功能,《strimzi實戰》是欣宸新的系列原創,旨在與大家一起通過實戰學習和掌握strimzi,並且深入源碼 ...
  • Go指針為程式員提供了對記憶體的深入管理能力,同時確保了代碼的安全性。本文深入探討了Go指針的基礎概念、操作、深層理解及其特性與限制。通過深入瞭解其設計哲學和應用,我們可以更好地利用Go的強大功能。 關註公眾號【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯 ...
  • 第1天安裝並初體驗了一把Dart程式,本文按照Dart官網的“代碼實驗室”把Dart的基礎語法練習一遍,基礎語法特性很多,因此建議收藏本博客了 [本博客疑問:為什麼函數有了命名參數,還需要可選的位置參數?歡迎評論區討論!]…… ...
  • 問題: 上一篇async/await 致WPF卡死問題(https://www.cnblogs.com/stephen2023/p/17725159.html),介紹主線程阻塞,async/await導致卡死問題,同樣的代碼在console下卻並不會出現卡死。 static Stopwatch sw ...
  • C#讀寫INI文件 .NET程式中,可以作為配置文件使用的格式又很多,INI文件在某些場景應用較為廣泛,如串口參數、一些工作站本地參數等等,INI文件主要用途為讀取指定節點的配置內容,以及修改指定節點。一下文章主要描述在程式對INI文件的操作。 INI文件介紹 INI文件 ini文件本質上就是一個擴 ...
  • Biwen.QuickApi 項目介紹 [QuickApi("hello/world")] public class MyApi : BaseQuickApi<Req,Rsp>{} 提供一種簡單集成的Minimal Web Api交互模塊 遵循了 REPR 設計 (Request-Endpoint- ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...