0

当特定核心执行语句时,有没有办法在 trace32 中放置断点。

我有一块四核cortex-a7板(树莓派 2)。我能够连接到它,放置断点(现在仅适用于核心 0),但我希望 trace32 仅在特定核心执行断点代码时才到达断点。比如说核心 3 执行它。

目前断点仅在 core-0 中命中。我编写了一个简单的程序,将 0-9 输出到 UART。此外,当我在 trace32 中运行任何程序时,通过将其直接加载到 RAM 中,似乎只有核心 0 正在执行,并且它反复进入“由向量捕获停止”,但是当我通过将程序加载到 sdcard/flash 内存中来尝试它时,所有四个核心似乎都在执行。

我已经通过激活其他内核和停用它们来检查 uart 输出,并且似乎这些内核确实被相应地激活和停用。

内核停用时的 uart 输出是正确/有序的(打印从 0 到 9 的系列),当内核处于活动状态时,它的混合 ( print of 0-9 are not in order),证明了我的假设。

此外,当它在核心 0 的断点处停止时,如果我从 trace32 状态栏中的下拉菜单中选择其他核心,则其他核心正在执行不同的语句。即不同核心的电脑是不同的。

我尝试使用条件断点,例如

break.set myfunc\7   /COND core()==3

但这似乎不起作用。

任何帮助表示赞赏。提前致谢

4

3 回答 3

0

其实有一点很奇怪,到目前为止我记得,每次下断点都会为内核的所有调试资源启用,即所有内核。因此,似乎您在调试应用程序时没有启用所有内核。如何启动核心?你在使用任何操作系统吗?或者只是一个裸机应用程序?

于 2016-05-27T15:41:18.847 回答
0

您显然在 SMP 配置(所有内核一个 GUI)中使用 TRACE32,而不是 AMP 配置(每个内核一个 GUI)。在 SMP 配置中,始终为所有内核设置程序断点。

通过使用断点设置/CONDition <expr>断点仍然会停止任何核心。但是,调试器将立即重新启动任何不满足条件的内核。因此Break.Set myfunc\7 /CONDition CORE()==3将停止 myfunc() 的第 7 行中的任何核心,但 TRACE32 会重新启动任何不是您的第 4 个核心的核心。

请考虑:如果您将断点设置为可写程序地址(在 SRAM/DRAM 中),调试器将使用软件断点:断点指令在您的应用程序代码中被修补。因此,只要您的所有内核从相同的内存位置执行相同的代码,它们就必须停止。

因此,也许某些内核不会停止,因为它们不会从同一内存位置执行相同的代码:要么您在不同内核的内存中多次使用相同的代码。或者你有一个缓存问题。

如果您假设存在缓存问题,请尝试将断点设置为 onchip-breakpointBreak.Set myfunc\7 /CONDition CORE()==3 /Onchip


一般来说,如果你的核心工作是从 SD 卡中找到的,但不是在调试器中,你很可能缺少一些配置,这是由引导加载程序完成的,或者当你从 SD 卡启动时。考虑到 TRACE32 通常从您的复位向量开始,而处理器通常执行一些引导加载程序代码以从 SD 卡获取应用程序。

如果你认为你的问题是由调试器引起的,你应该联系劳特巴赫支持,我猜。

于 2016-05-30T15:26:14.393 回答
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在这种情况下很有用。此处对其进行了描述。

 Frame.SWAP  // Restore initial state of registers

您还可以切换到此处所述的基于日志记录的方法。

要检查 core-selective 命令是否工作:

  1. 为核心 0 执行 ---> 核心应该在函数结束时停止
  2. 为核心 3 执行 ---> 核心应该在第一个断点处停止

如果您看到此行为,则可以很好地确认核心选择性断点工作正常。如果你得到一个积极的结果,下一步就是找出为什么只有核心 0 进入这个函数。

如果您想了解其他核心在做什么,您可以尝试基于样本的分析。请注意,它的准确性不高。请查看该命令的文档PERF

另一种选择是Snooper定期跟踪程序计数器的命令。

于 2016-05-27T18:56:14.793 回答