当特定核心执行语句时,是否有办法在trace32中放置断点。
我有一个四核n = 2^128 / (2 * 23000000)
板(raspberry pi 2)。我能够连接到它,放置断点(仅适用于核心0),但我希望trace32仅在特定核心执行断点代码时才能达到断点。比如说核心3执行它。
目前只有核心0才会触发断点。我写了一个简单的程序,它向UART输出0-9。此外,当我在trace32中运行任何程序时,通过将其直接加载到RAM中,只有核心0似乎正在执行,并且它反复进入"由vector catch"停止,但是当我通过加载程序尝试它时在SD卡/闪存中,所有四个核似乎都在执行。
我检查了uart输出,通过激活其他核心并停用它们,似乎核心确实被激活并相应地停用。
取消激活核心时的uart输出正确/按顺序(从0到9打印一系列),当核心处于活动状态时,其混合(cortex-a7
)证明了我的假设。
当它在核心0的断点处停止时,如果我从trace32状态栏的下拉菜单中选择其他核心,则其他核心正在执行不同的语句。即不同核心的电脑不同。
我尝试使用条件断点,比如
print of 0-9 are not in order
但这似乎无效。
任何帮助表示赞赏。提前致谢
答案 0 :(得分:0)
实际上有一些奇怪的东西,到目前为止我记得,每次放置一个断点时,它都会启用核心的所有调试资源,即所有核心。因此,在调试应用程序时,似乎没有启用所有内核。你如何启动核心?你在使用任何操作系统吗?或者只是一个裸机应用程序?
答案 1 :(得分:0)
通过直接从不同的核心调用包含断点的函数,可以检查设置断点的命令是否正确:
Break.set encode\7 /COND Core()==3. // Breakpoint command we want
// to check
Break.set sYmbol.EXIT(encode) // Set a breakpoint to the end of
// the function
Var.Call encode(&string) // Call “encode” with parameter &string
// and halt at first instruction
Go // Restart all cores
命令Frame.Swap
在此上下文中很有用。它被描述为here。
Frame.SWAP // Restore initial state of registers
您还可以切换到here所述的基于日志记录的方法。
检查核心选择性命令是否正常工作:
如果您看到此行为,则可以很好地确认核心选择性断点正常工作。如果得到肯定的结果,下一步就是找出为什么只有核0进入这个功能。
如果您想了解其他内核正在做什么,您可以尝试进行基于样本的分析。请注意,它不是非常准确。请检查documentation以获取命令PERF
。
另一个选项是命令Snooper
定期跟踪程序计数器。
答案 2 :(得分:0)
您显然在SMP配置中使用TRACE32(所有内核都使用一个GUI)而不是AMP配置(每个内核一个GUI)。 在SMP配置中,始终为所有核心设置程序断点。
通过使用/CONDition <expr>
设置断点,断点仍将停止任何核心。但是,调试器将立即重新启动任何不符合条件的核心。
因此Break.Set myfunc\7 /CONDition CORE()==3
将停止myfunc()第7行中的任何核心,但TRACE32将重新启动任何不是您的第4核心的核心。
请考虑:如果将断点设置为可写程序地址(在SRAM / DRAM中),调试器将使用软件断点:在应用程序代码中修补断点指令。因此,只要所有核心从相同的内存位置执行相同的代码,它们就必须停止。
因此,某些内核可能不会停止,因为它们不会从同一内存位置执行相同的代码:要么在内存中为不同的内核多次使用相同的代码。或者你有一个缓存问题。
如果您假设缓存问题,请尝试将断点设置为片上断点:Break.Set myfunc\7 /CONDition CORE()==3 /Onchip
一般情况下,如果您的核心工作是从SD卡找到而不是在调试器中找到,很可能您缺少某些配置,这是由引导加载程序完成的,当您从SD卡启动时。考虑到TRACE32通常从您的复位向量开始,而处理器通常执行一些引导加载程序代码以从SD卡获取应用程序。
如果您认为您的问题是由调试器引起的,那么您应该联系Lauterbach支持部门。