调试 ARM 汇编(Neon 扩展)

4
我正在开发一个使用ARM Neon指令的算法。我正在使用汇编文件(.S而不是内联汇编)编写代码。
我的问题是,为了调试目的,即查看寄存器、内存等,最好的方法是什么。 目前,我正在使用Android NDK进行编译,并在我的Android手机上运行算法。

单步执行ARM代码并查看NEON寄存器的最佳且唯一方式是使用Microsoft的Visual Studio,在Surface RT(或2)上通过WIFI连接到Windows PC进行操作。 - BitBank
1
对于简单的汇编块,您可以尝试使用NEVADA,但是您必须手动设置测试条件,而不是在应用程序中就地测试。 - sh1
1个回答

5

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

您可以使用gdb / gdbserver在Android手机上远程控制应用程序的执行。我在这里没有给出详细信息,因为它们经常更改,但例如,您可以从此 answer 开始或在Internet上进行快速搜索。学习如何使用GDB可能似乎有一个高陡峭的曲线,但是网络上的材料是详尽的。您可以轻松找到自己喜欢的内容。

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

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

由于您提到使用.S文件而不是.s文件,因此可以利用gcc进行预处理/宏处理。这样启用、禁用BRK可能会变得不那么困难。

这种工作方式的一个大缺点是周转时间。如果有某个特定点需要使用gdb进行调试,您必须确保在那里有一个BRK指令,这可能需要另一个构建/推送/调试周期。


谢谢@auselen。你能详细解释一下.S.s之间的区别吗?预处理是什么意思?在C语言中? - Hamid Bazargani
2
.S.s的区别在于.S文件旨在由C预处理器cpp进行预处理。它处理像#define#ifdef等的内容。请参见https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html获取官方评论。 - Charles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接