调试 ARM 程序集(Neon 扩展)

标签 debugging assembly android-ndk arm

我正在开发一种使用 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/

相关文章:

android - 在Android NDK上编译并运行动态创建C程序

python - django 中的 PyCallGraph 中间件

java - 远程调试从 Eclipse 中的远程项目读取日志

Clang 集成汇编器和 "invalid operand for instruction"

windows - 如何在汇编程序中更改屏幕背景

java - 如何在 JNI 调用之间保存对象?

android-ndk - 在android ndk项目中添加libpng

debugging - Nuget - 带有新 csproj 的命令行参数(包含用于调试的符号)

c++ - 使用 Eclipse CDT 调试 ncurses

linux - 64 位 linux,汇编语言,问题?