我正在开发一种使用 ARM Neon 指令的算法。我正在使用汇编程序文件(.S
并且没有内联 asm)编写代码。
我的问题是调试目的的最佳方法是什么,即查看寄存器、内存等。
目前,我正在使用 Android NDK
进行编译,并使用我的 Android 手机来运行该算法。
最佳答案
穷人的调试解决方案...
您可以使用gdb
/gdbserver
远程控制Android手机上应用程序的执行。我不会在这里提供完整的详细信息,因为它们一直在变化,但例如您可以从这个 answer 开始或者在互联网上快速搜索。学习使用 GDB 似乎有一个很高的陡峭曲线,但网上的 Material 很详尽。您可以轻松找到适合您口味的东西。
通过软件工具单步执行 ARM 内核非常困难,这就是为什么 ARM 生态系统充满了昂贵的工具和额外的硬件设备。
我使用的技巧是在汇编代码中手动插入 BRK
指令。 BRK 是自托管调试断点。当核心看到此指令时,它会停止并通知操作系统有关情况。然后操作系统通知调试器有关情况并将控制权传递给它。当调试器获得控制权时,您可以检查寄存器的内容,甚至可能对其进行更改。操作的最后一部分是让您的流程继续进行。由于PC
仍在我们的断点指令处,因此您必须做的是增加PC
,将其设置为BRK
之后的指令。
既然您提到您使用 .S
文件而不是 .s
文件,您可以利用 gcc
进行预处理/宏工作。这样,启用、禁用 BRK
可能就不再是一个问题。
这种工作方式的最大缺点是周转时间。如果您想使用 gdb 调查某个点,则必须确保那里有一个 BRK
指令,这可能需要另一个构建/推送/调试周期。
关于调试 ARM 程序集(Neon 扩展),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29934786/