首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android代码中的SIGILL

Android代码中的SIGILL
EN

Stack Overflow用户
提问于 2011-08-18 05:03:07
回答 3查看 4.4K关注 0票数 10

我有一个NDK应用在市场上,并得到了一个关于SIGILL信号的本地崩溃报告。(我使用谷歌断板生成本机崩溃报告。)以下是详细信息:

  • 我的应用程序是为armeabi-v7a霓虹灯支持编译的。
  • 它在NVIDIA Tegra 2处理器上坠毁,这是ARM-7 (Cortex-A9).
  • 每次都会发生。(与用户联系)
  • 坠机地址在0x399cc,信号是SIGILL,在我的代码中。

登记和拆卸:

代码语言:javascript
复制
 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>

完整的源代码和汇编程序可用的这里 (它很短,基本上是2行C++)。

您可以看到,0x399cc位于fconstd指令的中间。根据arm.com的说法,这条指令是在VFP-v3中添加的,它应该(我认为)可以在任何现代处理器中使用。

会发生什么事?地址位于指令中间这一事实是否指向某个已损坏的指针?(请注意,反向跟踪非常有意义,因此它不像在意外事件中调用此函数一样。)或者是别的什么东西?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-18 08:00:36

好的,我明白了: NVIDIA 2只有16位64位的GPU寄存器,因此要瞄准它,你必须使用-mfpu=vfpv3-d16编译。所讨论的指令使用寄存器d16,它“太多了”。:(

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

票数 16
EN

Stack Overflow用户

发布于 2013-07-18 12:55:06

尝试将*.so放在一个名为“externallibs”的文件夹中,并在armeabi-v7a文件夹中复制和粘贴*.so之后,使用它构建ndk。这对我有帮助。另一个解决方案是,如果可能的话,移除霓虹灯的支持。

票数 0
EN

Stack Overflow用户

发布于 2022-09-27 14:05:48

(我知道答案,但这是我在搜索时得到的第一个结果。)

至少在ARM 32位设备上(我认为这是一种体系结构问题,不依赖于clang标志或NDK,但我很乐意加以纠正),如果您有一个返回某些内容的函数,比如int getSomeThing();和您的 not ,则在该函数的末尾有一个return语句,您可能会遇到错误的SIGILL。

所以这个:

代码语言:javascript
复制
int returnSomething() {
  // do stuff
  if(whatever) {
    // more code
  } // SIGILL at the end of the last block or instruction
  // no return 0; here
}

会触发它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7102606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档