android ndk空指针导致CRASH的问题
来源:互联网 发布:java静态变量重新赋值 编辑:程序博客网 时间:2024/04/29 15:31
1. APP启动时隔三差五地随机性地CRASH,捕捉到的日志:
----------------2013-06-03 10:26:52----------------#00 pc 0002e9b4 /data/data/com.XXXX.map/lib/libmapengine.so#01 lr 8082dc97 /data/data/com.XXXX.map/lib/libmapengine.so
2. CRASH在汇编码2e9b4位置,通过objdump工具生成so包对应的汇编文件,查找定位crash位置:
0002e9b4 <_ZN12TextureCache15ensureCacheSizeEi>: 2e9b4:6803 ldrr3, [r0, #0] 2e9b6:428b cmpr3, r1 2e9b8:da00 bge.n2e9bc <_ZN12TextureCache15ensureCacheSizeEi+0x8> 2e9ba:6001 strr1, [r0, #0] 2e9bc:4770 bxlr第一行 2e9b4位置。
3. 对应ensureCacheSize函数源码:
void TextureCache::ensureCacheSize(int size){if(limit < size){limit = size;}}
看到函数源码以后,一时有点丈二摸不着头脑了,函数内部就一个if判断,何来的crash?2e9b4位置而且是一个ldr寻址操作,根据汇编源码得知是取limit成员变量值。
4. 跟一位经验丰富地同事讨论,他说这是典型地空指针导致的CRASH问题,原因如下:
这个函数如此调用:tileTexCache->ensureCacheSize(blkNum + 1); 当tileTexCache指针为空时,并不是在函数调用这行CRASH,而是在成员函数内部。
原理《C++对象模型》书中有讲解:C++中类的成员函数和成员变量不太一样,成员变量定义在对象内部,跟对象一个级别,与this指针有关;而成员函数则定义在类内部,跟类一个级别,与this指针无关。换个角度理解这句话,即使对象指针为空,通过空对象指针访问成员函数也是可以,只有当成员函数内部需要访问成员变量时才会CRASH,因为成员变量定义在对象内部。这个道理我懂,但怎么也跟空指针联系起来!
5. 测试DEMO
class EmptyPointerApp {public:void safeFunc() {cout << "World Peace" << endl;}void badFunc() {cout << "Will Crash" << endl;mData = 1;}private:int mData;};int main(int argc, char** argv){EmptyPointerApp* pSample = NULL;pSample->safeFunc();pSample->badFunc();}vs2008,CRASH在mData=1语句,此时输出:
World PeaceWill Crash调试中断后打开反汇编窗口:
第一个mov将this指针内容放到eax寄存器中,dword ptr指明了指令访问内存的单元是一个dword,即四个字节长度。
第二个mov通过eax访问mData成员时CRASH!
- android ndk空指针导致CRASH的问题
- Android 7.0 广播导致的crash问题
- properties导致空指针的问题
- WebView loadurl导致的空指针问题
- 《Linux kernel panic》内核模块空指针导致系统crash
- 解决android应用被强杀或应用被回收导致的空指针问题
- RapidXML 导致的 crash 问题
- Android因为Application导致的空指针异常
- Android--关于Cursor空指针的问题
- 关于CALayer导致的crash问题
- 关于CALayer导致的crash问题
- VirtualProtect导致程序crash的问题。
- unbindService()导致应用Crash的问题
- 复合主键导致的空指针错误
- 复合主键导致的空指针错误
- 依赖注入导致的空指针异常
- 安卓应用 后台被强杀, 返回前台时 出现空指针 导致Crash
- Android 控件 空指针问题
- TYPO3 的命名空间
- Visual Studio 2010安装后出现“未能初始化‘新建项目’”错误
- Windows Phone 7 优秀开源项目概览
- EXC_BAD_ACCESS iOS6 GM UITableTextAccessibilityElement
- C#将数据集DataSet中的数据导出到EXCEL文件的几种方法
- android ndk空指针导致CRASH的问题
- C# 将Word文档转换为HTML
- iOS UIWebView下拉刷新实现
- JavaScript 拖放效果
- flex验证码生成
- objective-C 中使用@Class和 #import区别
- SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法
- 毕业设计中外文文献的查阅网站
- React中文教程翻译文档 - Common Questions 常见问题