本人第一次在网上写文章,有什么好的地方请大家担待,有问题欢迎提出,一起讨论。下面我遇到的问题,有需要的朋友可以参考。
06-10 15:43:28.528: A/libc(10013): Fatal signal 6 (SIGABRT) at 0x0000271d (code=-6), thread 10013 (.clov4r.ad.nil1)
06-10 15:43:28.628: I/DEBUG(106): * *
06-10 15:43:28.628: I/DEBUG(106): Build fingerprint: ‘rockchip/rk3188/rk3188:4.4.2/KOT49H/eng.yangfeihu.20141226.153135:eng/test-keys’
06-10 15:43:28.628: I/DEBUG(106): Revision: ‘0’
06-10 15:43:28.628: I/DEBUG(106): pid: 10013, tid: 10013, name: .clov4r.ad.nil1 >>> com.clov4r.ad.nil1 <<<
06-10 15:43:28.638: I/DEBUG(106): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr ——–
06-10 15:43:28.738: I/DEBUG(106): r0 00000000 r1 0000271d r2 00000006 r3 00000000
06-10 15:43:28.738: I/DEBUG(106): r4 00000006 r5 0000000c r6 0000271d r7 0000010c
06-10 15:43:28.738: I/DEBUG(106): r8 be97a168 r9 415b0bc4 sl 41602410 fp be97a17c
06-10 15:43:28.738: I/DEBUG(106): ip 402fe3d0 sp be97a0c0 lr 400df09d pc 400ee048 cpsr 000b0010
06-10 15:43:28.738: I/DEBUG(106): d0 000000003a70697a d1 0000000000000000
06-10 15:43:28.738: I/DEBUG(106): d2 0000000000000000 d3 0000000000000000
06-10 15:43:28.738: I/DEBUG(106): d4 0000000000000000 d5 000c000c000c000c
06-10 15:43:28.738: I/DEBUG(106): d6 0000000100000000 d7 3f8000003f800000
06-10 15:43:28.738: I/DEBUG(106): d8 3f8000003f800000 d9 0000000000000000
06-10 15:43:28.738: I/DEBUG(106): d10 0000000000000000 d11 43dd924844280000
06-10 15:43:28.738: I/DEBUG(106): d12 447a00004213b6db d13 3f800000447a0000
06-10 15:43:28.738: I/DEBUG(106): d14 43f009234213b6db d15 43f0800040e00000
06-10 15:43:28.738: I/DEBUG(106): d16 004f004e004d004c d17 0053005200510050
06-10 15:43:28.738: I/DEBUG(106): d18 001fc000001e4000 d19 0022c00000214000
06-10 15:43:28.738: I/DEBUG(106): d20 000c0000000c0000 d21 000c0000000c0000
06-10 15:43:28.738: I/DEBUG(106): d22 0000000100000001 d23 0000000100000001
06-10 15:43:28.738: I/DEBUG(106): d24 0000001400000013 d25 0000001700000016
06-10 15:43:28.738: I/DEBUG(106): d26 0707070703030303 d27 00430011003d0010
06-10 15:43:28.738: I/DEBUG(106): d28 0000001300000012 d29 0000001600000015
06-10 15:43:28.738: I/DEBUG(106): d30 004f001400490013 d31 005b001700550016
06-10 15:43:28.738: I/DEBUG(106): scr 68000011
06-10 15:43:28.738: I/DEBUG(106): backtrace:
06-10 15:43:28.748: I/DEBUG(106): #00 pc 00022048 /system/lib/libc.so (tgkill+12)
06-10 15:43:28.748: I/DEBUG(106): #01 pc 00013099 /system/lib/libc.so (pthread_kill+48)
06-10 15:43:28.748: I/DEBUG(106): #02 pc 000132ad /system/lib/libc.so (raise+10)
06-10 15:43:28.748: I/DEBUG(106): #03 pc 00011fe3 /system/lib/libc.so
06-10 15:43:28.748: I/DEBUG(106): #04 pc 000218fc /system/lib/libc.so (abort+4)
06-10 15:43:28.748: I/DEBUG(106): #05 pc 00000921 /system/lib/libstdc++.so (operator new(unsigned int)+8)
06-10 15:43:28.748: I/DEBUG(106): #06 pc 0000c431 /system/lib/libandroidfw.so (android::_CompressedAsset::getBuffer(bool)+12)
06-10 15:43:28.748: I/DEBUG(106): #07 pc 0007ee09 /system/lib/libandroid_runtime.so
06-10 15:43:28.748: I/DEBUG(106): #08 pc 0001dbcc /system/lib/libdvm.so (dvmPlatformInvoke+112)
06-10 15:43:28.748: I/DEBUG(106): #09 pc 0004e123 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
06-10 15:43:28.748: I/DEBUG(106): #10 pc 00026fe0 /system/lib/libdvm.so
06-10 15:43:28.748: I/DEBUG(106): #11 pc 0002dfa0 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
06-10 15:43:28.748: I/DEBUG(106): #12 pc 0002b638 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
06-10 15:43:28.748: I/DEBUG(106): #13 pc 00060865 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+392)
06-10 15:43:28.748: I/DEBUG(106): #14 pc 000687c7 /system/lib/libdvm.so
06-10 15:43:28.748: I/DEBUG(106): #15 pc 00026fe0 /system/lib/libdvm.so
06-10 15:43:28.748: I/DEBUG(106): #16 pc 0002dfa0 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76)
06-10 15:43:28.748: I/DEBUG(106): #17 pc 0002b638 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
06-10 15:43:28.748: I/DEBUG(106): #18 pc 00060581 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336)
06-10 15:43:28.748: I/DEBUG(106): #19 pc 00049d0b /system/lib/libdvm.so
06-10 15:43:28.748: I/DEBUG(106): #20 pc 0004ce7f /system/lib/libandroid_runtime.so
06-10 15:43:28.748: I/DEBUG(106): #21 pc 0004dba3 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+354)
06-10 15:43:28.748: I/DEBUG(106): #22 pc 0000105b /system/bin/app_process
06-10 15:43:28.748: I/DEBUG(106): #23 pc 0000e403 /system/lib/libc.so (__libc_init+50)
06-10 15:43:28.748: I/DEBUG(106): #24 pc 00000d7c /system/bin/app_process
06-10 15:43:28.748: I/DEBUG(106): stack:
06-10 15:43:28.748: I/DEBUG(106): be97a080 400dd885 /system/lib/libc.so (dlrealloc)
下面是很多堆栈信息,因为太长了我就不粘上来了。
下面来介绍一下我们的程序,程序是一个类似播放器的项目,里面可以循环播放文本,模拟时钟,图片,视频之类的。第一次这个问题出现的时候,发现是在播放文本的时候出现的,由于也没有调试这方面bug的经验,所以就在网上很多地方去查找,也找到了类似这种bug,但是大部分都是百度地图问题,可是程序没有用到百度地图,所以这里就直接排除了。还有说用ndk-stack工具可以调试出这类崩溃bug的具体问题,我也调试了一下未果。
这类问题最头疼的就是偶发性,不知道在什么地方就会出现,我经过长时间测试,发现我们程序会在2个小时-3个小时就会出现,而且出现的地方不确定。有模拟时钟,你文本窗,也有计时窗(都是显示文本的地方,但是我当时没有发现这个规律)。
没办法,找不到问题所在,而且是一个崩溃bug很严重,我就给整个可能出现错误的地方写Log,然后通过上一次崩溃Log一次一次,缩小范围。
最后发现大部分崩溃的时候都是在获取自定义字体的时候。
代码如下:
addTypeface = Typeface.createFromAsset(asset, "AddElectricCity.ttf");
然后反复测试,发现单独执行这段代码是没有问题的,于是我有增加调用次数和换大一些和小一些的字体库。结果!!!果然是程序运行没多长时间,就会报这个错误。
终于找到问题,那么解决它就好处理多了。由于是多次调用会出现这种bug,单词调用并不会出现,所以我在程序初始化时,首先初始化字体库,并且赋值给静态全局变量这样,不管程序在哪调用,都可以直接调用这个静态全局变量,而不用频繁去create这个字体库。
/**
* 初始化字体库
*
* @param context
*/
public static void initTypeface(AssetManager asset) {
addTypeface = Typeface.createFromAsset(asset, "AddElectricCity.ttf");
berTypeface = Typeface.createFromAsset(asset, "Berlin Allee.ttf");
daiTypeface = Typeface.createFromAsset(asset, "daijin.ttf");
dejTypeface = Typeface.createFromAsset(asset, "DejaVuSansMono.ttf");
droTypeface = Typeface.createFromAsset(asset, "DroidSans.ttf");
}
通过这个bug学习到了很多东西,首先需要耐心调,对程序了解或对出错代码块了解,还要有“就是自己程序有问题这种意识”,因为看上面报错信息全是在系统库里,我们android机器是单独定制盒子,所以刚开始就想说是硬件系统问题,不想去调试,有点逃避的想法,后来我们公司有人就告诉我,有错也是程序调用问题,就在程序中找,果然最后还是在程序中找到了问题,给自己上了一课。
代码规范也是一个很重要的问题,可以避免很多不应该出现的bug。希望自己在以后的开发道路中可以多多学习,多多注意代码规范,写出更优秀的程序。
感谢大家可以在百忙之中耐心看完我这篇文章,在这里先谢谢大家,由于我解决这个问题花费了很多时间,所以希望遇到这类问题的朋友,可以通过我这篇文章得到一些启发和帮助少走一些弯路。