调试 ARM 程序集(Neon 扩展)

Debugging an ARM assembly (Neon extension)

我正在开发一种使用 ARM Neon 指令的算法。我正在使用汇编文件编写代码(.S 并且没有内联 asm)。

我的问题是什么是调试目的的最佳方法,即查看寄存器、内存等。 目前,我正在使用 Android NDK 编译,我的 Android phone 到 运行 算法。

穷人的调试解决方案...

您可以使用 gdb / gdbserver 远程控制 Android phone 上应用程序的执行。我没有在这里提供完整的详细信息,因为它们一直在变化,但是例如,您可以从这个 answer 开始,或者在 Internet 上进行快速搜索。学习使用 GDB 似乎有一个陡峭的曲线,但是 material 在网络上是详尽无遗的。您可以轻松找到适合自己口味的东西。

很难通过软件工具单步执行 ARM 内核,这就是为什么 ARM 生态系统充满了昂贵的工具和额外的硬件设备。

我使用的技巧是在汇编代码中手动插入 BRK 指令。 BRK 是 自托管调试断点。 当核心看到这条指令时,它会停止并通知 OS 有关情况。 OS 然后通知调试器有关情况并将控制权交给它。当调试器获得控制权时,您可以检查寄存器的内容,甚至可以对它们进行更改。操作的最后一部分是让您的过程继续。由于 PC 仍在我们的断点指令处,您必须做的是增加 PC,将其设置为 BRK 之后的指令。

由于您提到您使用 .S 文件而不是 .s 文件,您可以利用 gcc 进行预处理/宏工作。这样启用、禁用 BRK 可能就不那么成问题了。

这种工作方式的一大缺点是周转时间。如果你想用 gdb 研究某个点,你必须确保那里有一个 BRK 指令,这可能需要另一个 build/push/debug 周期。