【问题标题】:lauterbach trace32 CPU Core specific conditional breakpoint with arm cortex a7劳特巴赫 trace32 CPU 核心特定条件断点与 arm cortex a7
【发布时间】:2023-03-14 20:06:01
【问题描述】:

当一个特定的核心执行一个语句时,有没有办法在 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

但这似乎不起作用。

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

【问题讨论】:

    标签: raspberry-pi2 multicore cortex-a lauterbach trace32


    【解决方案1】:

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

    【讨论】:

    • 它的裸机,使用 UART(在 raspi 2 上),并打印 0-9。我的配置文件在启动时激活所有内核(根据 raspi 论坛)--- kernel_old=1 kernel_address=0x0 disable_commandline_tags=1 ----- uart 输出证实了这一点,当我使用上述配置文件时,uart 输出为混合,即 0-9 不按顺序排列,因为不同的内核正在执行并且每个内核都试图打印其系列。如果没有配置文件,它会按顺序打印 0-9,确认只有核心 0 执行。在trace32中,当我手动中断并使用上述配置时,我可以看到不同的核心在不同的语句中。
    【解决方案2】:

    您可以通过直接从不同内核调用包含断点的函数来检查设置断点的命令是否正确:

    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 所述的基于日志记录的方法。

    检查核心选择性命令是否有效:

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

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

    如果您想了解其他内核在做什么,您可以尝试基于样本的分析。请注意,它的准确性不高。请检查documentation 以获取命令PERF

    另一个选项是命令Snooper 定期跟踪程序计数器。

    【讨论】:

    • 当我做 var.set myfunc(来自另一个核心)时,无论我是否调用 frame.swap,我都会得到 - “目标函数调用失败,pc 不在预期位置”第一次和断点也被另一个核心击中(在信息消息之后)。对 var.set 的后续调用有效,没有 msg。使用日志记录方法,调用函数,命中 Brk pt 并打印核心 0。我很确定,其他核心正在执行,因为当 Bkpt 被命中 & i 切换核心时,核心有不同的 PC。 UART 也证明了这一点。但是原来的问题依然存在,无法为0以外的核心设置断点。
    • 错误信息只是被命中的断点的影响。通常 TRACE32 会在函数调用完成后恢复初始上下文。断点可以防止这种情况发生。您的应用程序可能会进入不稳定状态。很可能命令Var.call 是一个更好的选择。之后只需使用Frame.Swap
    • 我尝试了你的建议,我可以单独调用每个核心的方法,但是当我执行“GO”时,它只在核心 0 上中断。有时它只在核心 1 上中断。在任何时候只有一个核心被击中。在运行时永远不会满足 core()==3 条件。只是从状态栏上下文菜单中选择核心并执行命令,还是有其他方法可以做到这一点?
    【解决方案3】:

    您显然在 SMP 配置(所有内核一个 GUI)中使用 TRACE32,而不是 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 卡获取应用程序。

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

    【讨论】:

    • 我尝试使用片上断点,结果是一样的,任何内核都没有命中条件断点。断点(片上/软)仅针对核心 0(奇怪的是有时是核心 1)。我从 SD 卡启动我的 Raspberry Pi 2,激活 JTAG,然后使用 trace32 加载我的裸机应用程序。我已经用单核 raspi-1 成功地尝试过这个,但是这个皮质版本它没有按预期工作。如果有人愿意在他的系统上试用它,我可以邮寄我的程序。人们报告说这样的设置适用于 openocd,那么为什么不使用 trace32?
    • 当你连接到你的开发板时,你使用的是 SYStem.Up 还是 SYStem.Attach?如果您已从 SD 卡执行引导代码,则它应该是“附加”,以避免任何核心重置。
    • 如何将裸机程序加载到目标内存?如果您执行简单的Data.LOAD.Elf myprog.elf,您将把代码下载到内存中,将调试符号加载到调试器,并将程序计数器活动内核设置为应用程序的入口点。我认为您应该通过 SD 卡加载代码,让引导加载程序处理程序计数器初始化,然后使用 Data.LOAD.Elf myprog.elf /NoCODE 将符号加载到调试器
    • System.attach 不起作用,进入核心 0 的“向量捕获”(我尝试了您建议的方法通过 SD 卡加载代码,然后是 System.attach +“Data.LOAD.Elf myprog .elf /NoCODE")。 Raspberry Pi 2 的标准方法是加载单独的程序来激活 JTAG 引脚(在 GPIO 上)并使用脚本加载主程序。劳特巴赫自己的树莓派 1(单核)示例脚本提供了这种方法。你有可能在你的最后尝试吗?我可以把程序和 trace32 脚本邮寄给你。
    • 我很想对此进行测试。不幸的是,在接下来的 6 天内,我无法使用 Raspberry。也许您应该在此期间联系劳特巴赫。他们通常反应很快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多