2017-02-14 227 views
2

嘗試在特定位置設置斷點並設置基於寄存器之一的值的觸發條件,例如, R1(Cortex-R系列CPU)。通過Trace32在斷點條件下使用寄存器

有沒有辦法在trace32中做到這一點?條件的語法是什麼?

+0

對不起,您是否可以說明「觸發條件」是什麼意思,您的意思是「只有當R1 ==某個值時,該斷點纔會停止執行」。 如果是這樣的話,我看到你可以做到的唯一方法是設置一個啓動Practice scriipt的斷點,並且練習腳本可以檢查觸發條件,從而恢復處理器上的執行(取消「去「命令)或停止腳本執行並將控制權釋放給用戶。請注意,這會對代碼執行時間產生一定的影響。 – juansolsona

+0

我的意思是規則的程序斷點與條件。它的條件很簡單,涉及靜態或未優化的堆棧變量。它看起來並不明顯,爲什麼在一個條件寄存器應該是任何不同的 - 所以也許我只是錯過了正確的語法來引用一個寄存器? T32使用'register.xxx'來操作它們。雖然沒有看到任何帶有可以放入'watch'窗口的寄存器的結構 –

回答

3

您還可以檢查斷點狀態下的寄存器值。

但是,請注意,條件斷點總是侵入芯片的運行時行爲。這意味着您的目標CPU將始終停在斷點位置,然後調試器會評估條件,然後在未滿足條件的情況下重新啓動CPU。 (請注意,「條件斷點」與「數據斷點」不同(某些值寫入某個位置)。數據斷點在許多芯片(如Cortex-R)上是非侵入式的)。

基本技巧是使用PRACTICE函數Register()來訪問一個內核寄存器。

要設置一個程序斷點,停止對某個程序的位置,並保持停止,如果一個核心寄存器包含一定值時,請使用以下命令之一:

  • Break.Set <prog.addr|symbol> /Program /CONDition Register(<reg.>)==<reg.value>
  • Break.Set <prog.addr|symbol> /Program /VarCONDition \Register(<reg.>)==<value>

如:

  • Break.Set P:0x1000 /Program /CONDition Register(R0)==0x42
  • Break.Set P:0x1000 /Program /VarCONDition \Register(R0)==0x42

兩個命令之間的差異?第一個使用TRACE32表達式,其中符號代表它們的地址(就像鏈接器看到符號一樣)。第二個使用所謂的HLL表達式,其中符號代表像C/C++語言中的變量。 (HLL expr。== C樣式表達式)

通常,在HLL表達式中編寫條件(特別是在處理變量時)會更容易,而在TRACE32表達式中使用PRACTICE函數通常更容易。

您還可以在Break.Set對話框中設置條件:單擊「高級」按鈕,然後在「CONDition」字段中單擊條件。字段「CONDition」右側的HLL複選框定義了您是否使用HLL表達式。