我正在开发一个使用ARM Neon指令的算法。我正在使用汇编文件(
我的问题是,为了调试目的,即查看寄存器、内存等,最好的方法是什么。 目前,我正在使用
.S
而不是内联汇编)编写代码。我的问题是,为了调试目的,即查看寄存器、内存等,最好的方法是什么。 目前,我正在使用
Android NDK
进行编译,并在我的Android手机上运行算法。.S
而不是内联汇编)编写代码。Android NDK
进行编译,并在我的Android手机上运行算法。穷人的调试解决方案...
您可以使用gdb
/ gdbserver
在Android手机上远程控制应用程序的执行。我在这里没有给出详细信息,因为它们经常更改,但例如,您可以从此 answer 开始或在Internet上进行快速搜索。学习如何使用GDB可能似乎有一个高陡峭的曲线,但是网络上的材料是详尽的。您可以轻松找到自己喜欢的内容。
通过软件工具逐条执行ARM核心很难,这就是为什么ARM生态系统充满了昂贵的工具和额外的硬件设备。
我使用的技巧是手动在汇编代码中插入BRK
指令。BRK是自托管调试断点。当核心看到此指令时,它会停止并通知OS有关情况。然后,OS通知调试器有关情况并将控件传递给它。当调试器获得控件时,您可以检查寄存器的内容,甚至可能对其进行更改。操作的最后一部分是使您的进程继续。由于PC
仍处于我们的断点指令处,因此您必须增加PC
,将其设置为BRK
后面的指令。
由于您提到使用.S
文件而不是.s
文件,因此可以利用gcc
进行预处理/宏处理。这样启用、禁用BRK
可能会变得不那么困难。
这种工作方式的一个大缺点是周转时间。如果有某个特定点需要使用gdb进行调试,您必须确保在那里有一个BRK
指令,这可能需要另一个构建/推送/调试周期。
.S
和.s
之间的区别吗?预处理是什么意思?在C语言中? - Hamid Bazargani.S
和.s
的区别在于.S
文件旨在由C预处理器cpp
进行预处理。它处理像#define
,#ifdef
等的内容。请参见https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html获取官方评论。 - Charles