android 電視core dump分析

來源:互聯網
上載者:User

標籤:

測試測了個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目錄下,

比如

[email protected]:~/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=<value optimized out>, stProgramInfoB=<value optimized out>)
    at ./middleware/src/MW_DTV_Program_DVB.cpp:600
#4  0x00108414 in std::__move_median_first<__gnu_cxx::__normal_iterator<_DVB_PROGRAMINFO*, std::vector<_DVB_PROGRAMINFO, std::allocator<_DVB_PROGRAMINFO> > >, unsigned char (*)(_DVB_PROGRAMINFO const&, _DVB_PROGRAMINFO const&)> (__a=..., __b=..., __c=...,
    __comp=0x119d5c <CompareDVB(ST_DVB_PROGRAMINFO const&, ST_DVB_PROGRAMINFO const&)>)
    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<__gnu_cxx::__normal_iterator<_DVB_PROGRAMINFO*, std::vector<_DVB_PROGRAMINFO, std::allocator<_DVB_PROGRAMINFO> > >, unsigned char (*)(_DVB_PROGRAMINFO const&, _DVB_PROGRAMINFO const&)> (__first=..., __last=<value optimized out>, __depth_limit=7,
    __comp=0x119d5c <CompareDVB(ST_DVB_PROGRAMINFO const&, ST_DVB_PROGRAMINFO const&)>)
    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<__gnu_cxx::__normal_iterator<_DVB_PROGRAMINFO*, std::vector<_DVB_PROGRAMINFO, std::allocator<_DVB_PROGRAMINFO> > >, int, unsigned char (*)(_DVB_PROGRAMINFO const&, _DVB_PROGRAMINFO const&)> (__first=..., __last=<value optimized out>, __depth_limit=7,
    __comp=0x119d5c <CompareDVB(ST_DVB_PROGRAMINFO const&, ST_DVB_PROGRAMINFO const&)>)
    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<__gnu_cxx::__normal_iterator<_DVB_PROGRAMINFO*, std::vector<_DVB_PROGRAMINFO, std::allocator<_DVB_PROGRAMINFO> > >, 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=<value optimized out>, U32ProgTargetIndex=<value optimized out>)
    at ./middleware/src/MW_DTV_CM_DVB.cpp:960
#10 0x000e521c in MSrv_DTV_Player_DVB::DoProgMove (this=<value optimized out>, u32SourceProgIndex=<value optimized out>,
    u32TargetProgIndex=<value optimized out>) 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月的時候有人提交,也正好修改了這塊代碼,看來是這個原因了,先回退,再問問提交人當初提交的原因。


android 電視core dump分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.