NDK 编译armebai-v7a的crash Fatal signal 7 (SIGSEGV) 错误解决

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

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

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

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

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

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

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

<pre name="code" class="cpp">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字节对齐的赋值代码,修改掉之后,运行就没有问题了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 12:59:48

NDK 编译armebai-v7a的crash Fatal signal 7 (SIGSEGV) 错误解决的相关文章

Android:Fatal signal 11 (SIGSEGV), code 1, fault addr

游戏出现死机,错误为: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xfffffffc in tid 9811 (GLThread 205) 或者 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xfffffffc 解决方案: 1.继续往下查看日志,知道类似下面这条: #00 pc 0085ed5e  /data/app/cn.kvu.doudizhu-1/lib/arm/libcoc

关于cocos2dx 3.0升级崩溃报错(unable to load native library) 和(Fatal signal 11 (SIGSEGV) at 0x00000000)

最近一直在Windows平台开发cocos-2dx游戏,期间做了一次引擎升级,升级到了3.0正式版本.Windows平台上表现很正常,没有出现什么问题. 上周五准备发布一个安卓包,编译很轻松的就过了,没有花费多少时间,但是安装到手机后,发现运行就崩溃了.没办法只好用模拟机调试,再次吐槽Android的模拟器,真的太他妈慢了,不到万不得已我真的不想再去用它,google真的应该好好整一下了. 好不容易运行起来了,看到崩溃的时候logcat的报错是"unable to load native lib

Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 3661 (ervice.Executor)

前言:当我们在android中的使用JNI下编译的.so库时,很有可能底层编译好的native method出现异常,而且底层并没有对这个异常进行捕捉,这样在我们APK上就是表现为退出程序,查看打印信息,出现的提示是:A/libc(2730): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 3661 (ervice.Executor).这个是由android linux 内核libc函数抛出的一个打印,从上面我们只能知道内存操作

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 0xdeadbaad (code=1)05-06 15:59:44.911: I/DEBUG(3344): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***05-06 15:59:44.911: I/DEBUG(3344):

Fatal signal xx (SIGSEGV) at

Fatal signal 11问题的解决方法 http://blog.csdn.net/tankai19880619/article/details/9004619 Fatal signal xx (SIGSEGV) at xxxxxx 错误定位代码的解决方法 http://zzhhui.blog.sohu.com/266543920.html Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 25427 (pool-1-threa

[转]NDK编译库运行时报dlopen failed: cannot locate symbol &quot;__exidx_end&quot; 解决办法

原文链接:http://blog.csdn.net/acm2008/article/details/41040015 当用NDK编译的库在运行加载时报如下错: dlopen("/data/data/xxx.xxx.xxx/lib/libxxx.so") failed: dlopen failed: cannot locate symbol "__exidx_end" referenced by "libxxx.so"... 解决办法如下: 在你报

NDK编译库运行时报dlopen failed: cannot locate symbol &quot;__exidx_end&quot; 解决办法

当用NDK编译的库在运行加载时报如下错: dlopen("/data/data/xxx.xxx.xxx/lib/libxxx.so") failed: dlopen failed: cannot locate symbol "__exidx_end" referenced by "libxxx.so"... 解决办法如下: 在你报错的库libxxx.so的编译脚本Android.mk请加上:LOCAL_LDFLAGS += -fuse-ld=bf

openwrt编译Build dependency: Please do not compile as root.错误解决

Checking 'working-make'... ok. Checking 'case-sensitive-fs'... ok. Checking 'getopt'... ok. Checking 'fileutils'... ok. Checking 'working-gcc'... ok. Checking 'working-g++'... ok. Checking 'ncurses'... ok. Checking 'zlib'... ok. Checking 'gawk'... ok

求大神相助,关于 Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 1531

============问题描述============ 这个问题在网上查找了较多的资料 首先这是一个底层的错误 有人说这个是因为多线程互斥的问题,要加synchronized 有人说是因为jni问题 不过都没有解决我的问题,我发觉很多人都提到个问题 就是在2.x的系统就没有问题,放到4.x的系统就有问题了 我的也是这样的,有哪位大牛知道这个是什么问题吗? 有人说改SDl版本就可以了,这个怎么搞? ============解决方案1============ 你在什么情况下报的这个错呢,把log帖