关闭

NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

标签: androidcndk字节对齐armebai-v7a
1257人阅读 评论(0) 收藏 举报
分类:

一直都是编译armabi的,没有任何问题,这个架构是软件模拟浮点运算的。

后来看到NDK文档上说armabi-v7a是针对有硬件处理浮点计算的arm cpu的。

于是就修改配置编译armebai-v7a的so文件。



结果是编译没问题,一运行就是crash掉,Fatal signal 7 (SIGSEGV)错误。

进过排查才发现,crash掉的仅仅是对一个浮点变量赋值而已。

只不过,这个浮点内存,是一个连续内存中的一部分。



经过排查才发现,这个so文件使用了浮点指令,需要指针4字节对齐。举个例子

char*  ptr = malloc(10);
float* f   = (float*) (ptr + 2);
f[0]       = 1.0f;


这里f[0]就会crash掉,使用f指针的访问操作就报错。因为f指针没有4字节对齐。

malloc可以保证返回的指针是对齐的,对指针的偏移操作,导致指针没有4字节对齐,是非常隐蔽的。

究其原因,是因为arm cpu的指令,要求内存访问是4字节的整数倍,否则就会发生硬件报错。

当我断言代码中一定是这样的错误原因的时候。我做了一个测试,在程序启动的时候,用了以上代码。

然而,然而,并没有crash掉, 我了个fuck啊~

进过我锲而不舍的各种测试和猜测,我找到了必定crash的代码。如下

char*  ptr = malloc(10);
float* f   = (float*) (ptr + 2);
for (int i = 0; i < 1; i++) {
     f[0]  = 1.0f;
}

是的,很奇怪,只有在循环的时候非4字节对齐才会crash,我测试了for和while都是这样。


故事的结局是,我确实有for循环非4字节对齐的赋值代码,修改掉之后,运行就没有问题了。




1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

查看android native crash后的堆栈信息

每次发生android runtime exception后都手足无措,因为拿到的都是如下信息:adb logcat:F/libc (21559): Fatal signal 11 (SIGSE...
  • cutesource
  • cutesource
  • 2013-05-15 10:53
  • 20934

解析IOS崩溃日志(crash Log)

http://lieyunye.github.io/blog/2013/09/10/how-to-analyse-ios-crash-log/ http://blog.csdn.net/smking/...
  • xyxjn
  • xyxjn
  • 2015-01-30 18:25
  • 35370

Fatal signal 11问题的解决方法

项目问题,目前已解决;在此记录。 前些天在调试Camera模块;发现相同的代码在厂家提供的环境里边编译、就是ok的,在我们的源码树中编译,将HAL库推进去后、就会kernel panic。 一、现...
  • tankai19880619
  • tankai19880619
  • 2013-06-01 16:47
  • 79023

Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 错误 解决方案(android-ndk)

在Android里做ndk编程的时候,碰到个随机性错误 错误信息如下: 05-06 15:59:44.411: A/libc(3347): Fatal signal 11 (SIGSEGV) at...
  • u013491946
  • u013491946
  • 2017-08-01 17:58
  • 312

NDK 使用 addr2line 定位 Fatal signal (SIGSEGV) 错误

使用NDK编写native code时候,真机常会出现crash的错误。然后logcat就是一片错误堆栈。 I/DEBUG ( 2562): signal 11 (SIGSEGV), code 2...
  • tom_221x
  • tom_221x
  • 2015-07-07 14:52
  • 2774

简单新闻客户端(7)---图片加载过多导致的Fatal signal 11 (SIGSEGV)

问题描述:在尝试下拉加载更多的时候,前面几次都能正常加载。但是到第五次的时候开始出现Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1),并退出了程序。经过...
  • lw_zhaoritian
  • lw_zhaoritian
  • 2016-10-11 14:24
  • 837

Android fatal signal 11 sigsegv at 0x00000030 code 1 错误分析解决

fatal signal 11 sigsegv at 0x00000000 code 1这条代码很难搞,程序什么问题都没有,也没有很多的错误代码,就一条。看起来很棘手! 在android里面,这个代码...
  • caoyicheng1
  • caoyicheng1
  • 2014-01-03 19:55
  • 5336

android native开发 错误信息定位:Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 4785 (XXX)

最近开始做android底层开发,经常遇到C/C++代码报错,logcat只给出一大串堆栈信息,而无法定位到具体代码段,后来网上搜寻发现可以使用addr2line工具根据出错地址映射到出错行,例如: ...
  • u014642880
  • u014642880
  • 2014-11-02 21:16
  • 1922

Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1)

原代码是: HashMap listItemMap = new HashMap(); listItemMap.put("ItemImage", R.drawable.image1); l...
  • A991192001
  • A991192001
  • 2013-12-19 17:55
  • 1129

Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决

异常出现频率:非必现,乍看不可捉摸。 BUG导致:应用程序崩溃,过一小会儿会自动退出。 Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1) ...
  • sonikk
  • sonikk
  • 2013-07-01 18:43
  • 78386
    个人资料
    • 访问:294266次
    • 积分:4577
    • 等级:
    • 排名:第7455名
    • 原创:157篇
    • 转载:0篇
    • 译文:0篇
    • 评论:106条
    文章分类