一般而言,如果局部變量已聲明爲靜態,則只能在局部變量(在輸入其聲明函數之前)上設置斷點。 (這不是由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。
這些都是非常好的把戲。特別是「break.set/program/cmd ...」。我從來沒有想過可以這樣使用break命令。非常感謝! –