2014-03-03 122 views
2

從幫助文檔,設置數據訪問斷點,我們可以使用LauterBach在trace32中調試:有沒有辦法在進入上下文之前爲本地變量設置數據斷點?

var.break <variable> /READWRITE 

然而,當我們進入該變量的情況下才能做到這一點。

因爲我想編寫一個PRACTICE腳本來執行自動調試,所以我想在程序運行之前執行此操作。類似於

.... 
var.break <foo>::<variable> /READWRITE 
GO 
WAIT !run() 
... 

有沒有辦法做到這一點?

回答

3

一般而言,如果局部變量已聲明爲靜態,則只能在局部變量(在輸入其聲明函數之前)上設置斷點。 (這不是由TRACE32的限制沒有調試器可以在進入聲明函數之前,在非靜態變量設置一個斷點。)

讓我們假設你有一個這樣的功能:

int myFunc(int x) { 
    int myVar;   
    static int myStaticVar;  
    /* ... */ 
} 

對於靜態局部變量你可以用

`Var.Break.Set myFunc\myStaticVar /ReadWrite` 

讀/寫斷點設置的斷點通過使用位於地址比較你的目標CPU工作。所以這些類型的斷點只適用於靜態地址。然而,非靜態局部變量沒有固定的地址。它們位於核心寄存器中或相對於調用堆棧上的函數幀指針。

檢查局部變量的位置用命令Var.INFO myFunc\myVar

對於位於調用棧你可以用下面進入該功能前,設置讀/寫斷點上的本地(非靜態)變量絕招:

Var.NEWGLOBAL void * \temp  
Break.Set myFunc /Program /CMD "Var.Break.Set myVar /ReadWrite" /CMD "Var.Set \temp=&myVar" /RESUME 
Break.Set sYmbol.EXIT(myFunc) /Program /CMD "Break.Delete Var.VALUE(\temp)++(Var.SIZEOF(myVar)-1)" /RESUME 

這將設置輸入您的功能時停止你的CPU斷點。當CPU在此斷點處停止時,調試器將讀/寫斷點設置爲該變量。第三個命令確保在退出該函數時讀取/寫入斷點被刪除。 (否則,讀/寫斷點可能會在完全不同的功能上完全不同的變量觸發)

對於位於核心本地(非靜態)變量註冊你通常不會設置讀/寫斷點。 但是有些CPU支持核心寄存器的斷點。在這種情況下,你可以設置這樣的斷點:

Var.Break.Set myFunc /VarReadWrite myFunc\myVar 

Var.Break.Set myFunc /RegisterReadWrite R1 

第二種情況假設你知道你的變量位於核心寄存器R1。

+0

這些都是非常好的把戲。特別是「break.set /program/cmd ...」。我從來沒有想過可以這樣使用break命令。非常感謝! –

0

首先,我們不能爲局部變量設置斷點。原因是局部變量是自動類型變量,即這些變量僅在函數調用和函數退出之間的短暫持續時間內分配內存。沒有爲函數範圍外的局部變量分配內存。因此,不能在局部變量上設置斷點。

要解決此問題,您可以聲明全局變量而不是局部變量或聲明靜態局部變量。在靜態局部變量的情況下,分配的內存被保留在定義它的函數範圍之外。通過這樣做,你可以自動化你的測試,但局部變量不能幫助你。

相關問題