在trace32中进行LauterBach调试:是否可以在进入上下文之前为局部变量设置数据断点?

Eri*_*Sun 4 breakpoints local-variables trace32 lauterbach

在帮助文档中,可以使用以下命令设置数据访问断点

var.break <variable> /READWRITE
Run Code Online (Sandbox Code Playgroud)

但是,这仅在我们输入该变量的上下文时才有效。

因为我想编写PRACTICE脚本来执行自动调试,所以我想在程序运行之前执行此操作。就像是

....
var.break <foo>::<variable> /READWRITE
GO
WAIT !run()
...
Run Code Online (Sandbox Code Playgroud)

有办法吗?

Hol*_*ger 5

通常,如果局部变量已声明为静态,则只能在局部变量上设置断点(在进入其声明函数之前)。(这不是TRACE32的限制。在进入声明函数之前,任何调试器都不能在非静态变量上设置断点。)

假设您具有这样的功能:

int myFunc(int x) {
    int myVar;        
    static int myStaticVar;      
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

对于静态局部变量,可以使用以下命令设置断点

`Var.Break.Set  myFunc\myStaticVar  /ReadWrite`
Run Code Online (Sandbox Code Playgroud)

读/写断点通过使用位于目标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 
Run Code Online (Sandbox Code Playgroud)

这将设置一个断点,该断点将在进入功能时停止CPU。当CPU在此断点处停止时,调试器将读/写断点设置为变量。第三个命令确保退出功能时删除读/写断点。(否则,读/写断点可能会在完全不同的函数中的完全不同的变量上触发)

对于位于核心寄存器中的局部(非静态)变量,通常无法设置读取/写入断点。但是,某些CPU在核心寄存器上支持断点。在这种情况下,您可以这样设置一个断点:

Var.Break.Set myFunc /VarReadWrite myFunc\myVar
Run Code Online (Sandbox Code Playgroud)

要么

Var.Break.Set myFunc /RegisterReadWrite R1
Run Code Online (Sandbox Code Playgroud)

第二种情况假设您知道您的变量位于核心寄存器R1中。