android - Android NDK 代码中的 SIGILL

标签 android c++ assembly android-ndk arm

我有一个 NDK 应用程序上市,并获得了关于 SIGILL 信号的 native 崩溃报告。 (我使用 google breakpad 生成 native 崩溃报告。)以下是详细信息:

  • 我的应用是为 armeabi-v7a 编译的, 支持 NEON。
  • 它在 NVIDIA Tegra 2 处理器上崩溃,该处理器是 ARM-7 (Cortex-A9)。
  • 它每次都会发生。 (联系用户)
  • 崩溃地址在 0x399cc,信号是 SIGILL,它在我的代码中。

寄存器和反汇编:

 r4 = 0x001d50f0    r5 = 0x001d50f0    r6 = 0x598e2a3c    r7 = 0x00000000
 r8 = 0x00000001    r9 = 0x001c22b0   r10 = 0x00000000    fp = 0x81216264
 sp = 0x598e2a18    lr = 0x816399cb    pc = 0x816399cc

0x000399c6 <_ZN8Analyzer15setExpAvgFactorEi+22>:    blx 0x30508
0x000399ca <_ZN8Analyzer15setExpAvgFactorEi+26>:    fconstd d16, #7
0x000399ce <_ZN8Analyzer15setExpAvgFactorEi+30>:    vldr    d17, [pc, #32]  ; 0x399f2 <_ZN8Analyzer15setExpAvgFactorEi+66>

提供完整的源代码和汇编程序 here (很短,基本上是 2 行 C++。)

可以看到0x399ccfconstd指令的中间。根据arm.com此指令已添加到 VFP-v3 中,(我认为)它应该适用于任何现代处理器。

可能发生了什么?地址位于指令的中间这一事实是否指向某处损坏的指针? (请注意,回溯非常有意义,所以这个函数并不是偶然被调用的。)还是其他原因?

最佳答案

好的,我明白了:NVIDIA Tegra 2 只有 16 个 64 位 GPU 寄存器,因此要定位它,您必须使用 -mfpu=vfpv3-d16 进行编译。有问题的指令使用寄存器 d16,这“太多了”。 :(

这是对 NVIDIA 论坛的引用,其中一名员工提到了此限制:http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines

关于android - Android NDK 代码中的 SIGILL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102606/

相关文章:

android - 使用 MediaCodec 将一系列图像保存为视频

c - 如何在 Intel 语法中将立即值传递给汇编中的 shr?

c - ELF 如何填充它的 `short`?

android - getLastKnownLocation 在 Android 中返回 0,0

android - 捕获 Android 屏幕的视频

android - Visual Studio 2017 工具 -> Android 已禁用

java - 如何在 SWIG Java 目标中包装对枚举的所有引用?

c++ - boost::lexical_cast int 到用零填充的字符串

c++ - 我想要一个由空格分隔的 cstrings 数组

assembly - 32位汇编语言创建输出文件麻烦