【问题标题】:Debugging an ARM assembly (Neon extension)调试 ARM 程序集(Neon 扩展)
【发布时间】:2015-07-08 05:03:36
【问题描述】:

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

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

【问题讨论】:

  • 单步执行 ARM 代码并查看 NEON 寄存器的最佳和唯一方法是使用 Microsoft 的 Visual Studio 和 Surface RT(或 2)通过 WIFI 连接到 Windows PC。
  • 对于简单的组装块,您可以尝试NEVADA,但您必须手动设置测试条件,而不是在应用程序中进行就地测试。

标签: debugging assembly android-ndk arm


【解决方案1】:

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

您可以使用gdb / gdbserver 远程控制Android 手机上应用程序的执行。我在这里没有给出完整的细节,因为它们一直在变化,但是例如你可以从这个answer 开始或者在互联网上进行快速搜索。学习使用 GDB 似乎有一个陡峭的曲线,但是网络上的材料是详尽的。您可以轻松找到自己喜欢的东西。

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

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

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

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

【讨论】:

  • 谢谢@auselen。您能详细说明.S.s 之间的区别吗?预处理是什么意思?在 C 中?
  • .S.s 之间的区别在于.S 文件旨在由C 预处理器cpp 进行预处理。它处理诸如#defines、#ifdefs 之类的事情。等。官方评论见gcc.gnu.org/onlinedocs/gcc/Overall-Options.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
相关资源
最近更新 更多