调试ARM程序集(Neon扩展)

Ham*_*ani 4 debugging assembly arm android-ndk

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

我的问题是什么是调试目的的最佳方式,即查看寄存器,内存等.目前,我正在使用Android NDK编译和我的Android手机来运行算法.

aus*_*len 5

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

您可以使用gdb/ gdbserver远程控制Android手机上的应用程序执行.我不是在这里提供详细信息,因为它们一直在变化,但是例如你可以从这个答案开始,或者在互联网上快速搜索.学习使用GDB似乎有一个很高的曲线,但网上的材料是详尽无遗的.您可以轻松找到符合您口味的东西.

通过软件工具单步执行ARM内核很难,因此ARM生态系统充满了昂贵的工具和额外的硬件设备.

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

由于您提到使用.S文件而不是.s文件,因此您可以利用这些文件gcc进行预处理/宏工作.这种方式启用,禁用BRK可能不会成为问题.

这种工作方式的重大缺点是周转时间.如果你想用gdb调查某一点,你必须确保那里有一条BRK指令,这可能需要另一个构建/推送/调试周期.

  • `.S`和`.s`之间的区别在于`.S`文件旨在由C预处理器`cpp`进行预处理.它处理诸如``define`s,`#ifdef`s之类的东西.有关官方评论,请参阅https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html. (2认同)