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)
有办法吗?
通常,如果局部变量已声明为静态,则只能在局部变量上设置断点(在进入其声明函数之前)。(这不是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中。