android电视测试,android 电视机core dump分析

android 电视core dump分析

测试测了个bug, 操作dtmb 频道的时候系统重启, 由于生成了core dump文件,所以先看下core dump。

一 . 要想调试core dump,首先要生成core dump, 一般只有c/c++编译生成的二进制程序崩溃了才会生成core dump, 一般需要以下设置。

1)

运行ulimit -c  unlimited

----> 要置成unlimited, 这个代表core dump文件大小,默认是0, 即不生成core dump

2)设置core dump文件路径以及文件名格式,

运行

echo '%e.core.%p' > /proc/sys/kernel/core_pattern

其中%e代表程序名, %p代表进程号

3) 有人说要关闭android系统的watch dog(这个我不太确定是否影响),我们是在工厂模式里关闭,其他android电视或者手机不知道在哪关了。

命令1) 是每次开机都要运行的,如果嫌麻烦,可以把命令写到initrc文件里。因为是在boot.img里,需要重烧版本了。

二. 准备工作

要调试core dump首先需要满足两点

第一点)需要知道是哪个程序崩溃生成的core dump

方法一, 运行 file Coredump.gz

结果

Coredump.gz: ELF 32-bit LSB  core file ARM, version 1 (SYSV), SVR4-style, from '/applications/bin/tvos'

看到了吗, 是tvos程序, 路径在电视falsh 中的/applications/bin/下

方法二

运行

arm-none-linux-gnueabi-gdb /bin/ls ~/Coredump.gz

结果如下

.............

[New LWP 3129]

[New LWP 3956]

[New LWP 1724]

[New LWP 1746]

Core was generated by `/applications/bin/tvos'.

Program terminated with signal 6, Aborted.

#0  0x4120d976 in ?? ()

(gdb)

同样显示的是tvos程序。

i)这里我们用了一个小技巧,先随便写了一个程序的路径,例如我们上面写的是/bin/ls,  那么gdb打开后,就会告诉我们,这个core dump文件是/applications/bin/tvos生成的。

ii)arm-none-linux-gnueabi-gdb 是调试core的程序,这个是厂商提供给我们的。从名字可以看出来,我们板子用的cpu是arm的。

第二点)

我们需要的二进制程序tvos是需要带调试信息的,发布给用的都是不带符号表的,因为符号表会增大程序体积大小。之前我调试的时候就是用了不带符号表的二进制程序,所以死活打不出堆栈来。

一般要找到二进制程序都在symbol目录下,

比如

pengpai@pub:~/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova$ find -name tvos

./develop/include/tvos

./core/muf/tvos

./target/europe_dtv.edison/tmp_image/tvservice/applications/bin/tvos

./projects/symbols/applications/bin/tvos

./projects/tvos

./projects/tvos/main/bin.edison/tvos

看到了么,./projects/symbols/applications/bin/tvos这个才是带调试信息的符号表的,在symbols目录下。

如果不放心,可以运行命令 另外通过命令readelf -S tvos (S是大写)

结果

[24] .bss              NOBITS          007af000 79eeac 06b374 00  WA  0   0 4096

[25] .ARM.attributes   ARM_ATTRIBUTES  00000000 79eeac 000031 00      0   0  1

[26] .mmodule_version  PROGBITS        00000000 79eedd 0008b2 00      0   0  1

[27] .comment          PROGBITS        00000000 79f78f 00002a 01  MS  0   0  1

[28] .debug_aranges    PROGBITS        00000000 79f7c0 020608 00      0   0  8

[29] .debug_pubnames   PROGBITS        00000000 7bfdc8 159e85 00      0   0  1

[30] .debug_info       PROGBITS        00000000 919c4d c359c7 00      0   0  1

[31] .debug_abbrev     PROGBITS        00000000 154f614 0aef1e 00      0   0  1

[32] .debug_line       PROGBITS        00000000 15fe532 1e159f 00      0   0  1

[33] .debug_frame      PROGBITS        00000000 17dfad4 0ad6c4 00      0   0  4

[34] .debug_str        PROGBITS        00000000 188d198 38d683 01  MS  0   0  1

[35] .debug_loc        PROGBITS        00000000 1c1a81b 44c65c 00      0   0  1

[36] .debug_pubtypes   PROGBITS        00000000 2066e77 05984d 00      0   0  1

[37] .debug_ranges     PROGBITS        00000000 20c06c4 10bf38 00      0   0  1

[38] .shstrtab         STRTAB          00000000 21cc5fc 000198 00      0   0  1

[39] .symtab           SYMTAB          00000000 21ccdfc 17a820 10     40 61050  4

[40] .strtab           STRTAB          00000000 234761c 1ce257 00      0   0  1

Key to Flags:

看到那些 .dbug_开头的段了么, 这就是调试信息的段。

三.调试core dump

运行命令

1)cd /home/pengpai/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova/projects/symbols/applications/bin ---> 到tvos程序的路径下

2)  arm-none-linux-gnueabi-gdb ./tvos ~/Coredump.gz

3) 进入gdb后,运行bt, 查看当时的堆栈

结果

(gdb) bt

#0  0x4120d976 in ?? ()

#1  0x4121d0d2 in ?? ()

Backtrace stopped: frame did not save the PC

4) set solib-absolute-prefix /home/pengpai/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova/projects/symbols/

5)set solib-search-path /home/pengpai/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova/projects/dfbinfo/lib.edison

其中4)和5) 是要设置搜索so库的路径, gdb下运行 info info sharedlibrary可以看到哪些so没有被加载进来

6)bt

结果

#0  0x4120d976 in __libc_do_syscall ()

from/home/pengpai/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova/projects/symbols/lib/libc.so.6

#1  0x4121d0d2 in raise () from/home/pengpai/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova/projects/symbols/lib/libc.so.6

#2  0x4121fff0 in abort () from/home/pengpai/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova/projects/symbols/lib/libc.so.6

#3  0x0011a058 in CompareDVB (stProgramInfoA=, stProgramInfoB=)

at ./middleware/src/MW_DTV_Program_DVB.cpp:600

#4  0x00108414 in std::__move_median_first<:__normal_iterator std::vector std::allocator> > >, unsigned char (*)(_DVB_PROGRAMINFO const&, _DVB_PROGRAMINFO const&)> (__a=..., __b=..., __c=...,

__comp=0x119d5c )

at/opt/arm-2010.09/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/c++/4.5.1/bits/stl_algo.h:108

#5  0x00108564 in __unguarded_partition_pivot<:__normal_iterator std::vector std::allocator> > >, unsigned char (*)(_DVB_PROGRAMINFO const&, _DVB_PROGRAMINFO const&)> (__first=..., __last=

optimized out>, __depth_limit=7,

__comp=0x119d5c )

at/opt/arm-2010.09/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/c++/4.5.1/bits/stl_algo.h:2260

#6  std::__introsort_loop<:__normal_iterator std::vector std::allocator> > >, int, unsigned char (*)(_DVB_PROGRAMINFO const&, _DVB_PROGRAMINFO const&)> (__first=..., __last=,

__depth_limit=7,

__comp=0x119d5c )

at/opt/arm-2010.09/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/c++/4.5.1/bits/stl_algo.h:2302

#7  0x0052ae68 in sort<:__normal_iterator std::vector std::allocator> > >, unsigned char (*)(_DVB_PROGRAMINFO const&, _DVB_PROGRAMINFO const&)> (this=0xf040b0)

at/opt/arm-2010.09/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/include/c++/4.5.1/bits/stl_algo.h:5250

#8  MW_DTV_CM_DB<_dvb_programinfo _dvb_muxinfo st_dvb_sat_info st_dvb_network_info>::Sort (this=0xf040b0)

at/home/pengpai/A71S/E6700_A71S_Update_GridUI_svn2261_20150318/trunk/Supernova/projects/msrv/common/middleware/inc/MW_DTV_CM_DB.h:2358

#9  0x005690b0 in MW_DTV_CM_DVB::ProgramMove (this=0x67fbd0, u32ProgSourceIndex=, U32ProgTargetIndex=)

at ./middleware/src/MW_DTV_CM_DVB.cpp:960

#10 0x000e521c in MSrv_DTV_Player_DVB::DoProgMove (this=, u32SourceProgIndex=,

u32TargetProgIndex=) at ./src/MSrv_DTV_Player_DVB.cpp:2377

查看/middleware/src/MW_DTV_Program_DVB.cpp的600行,这里有一个assert。这个属于厂商的文件了。我们是改不了了, 再看了一下提交记录,

----------------------------------------

r2261 | jiang.t | 2015-01-26 09:53:10 +0800 (一, 2015-01-26) | 1 行

jiangt: 添加常州、邳州、上海 客制化城市排序功能, from 崔振宇

----------------------------------------

发现1月的时候有人提交,也正好修改了这块代码,看来是这个原因了,先回退,再问问提交人当初提交的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值