1. 程式人生 > >Android下除錯.so庫類的bug

Android下除錯.so庫類的bug

在做dlna應用時遇到系統無法播放視訊和音訊檔案,列印了一些debug資訊,

I/DEBUG   (  795): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  795): Build fingerprint: 'unknown'
I/DEBUG   (  795): pid: 2830, tid: 3185, name: DOWNLOADMODULE  >>> /system/bin/mediaserver <<<
I/DEBUG   (  795): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000014
I/DEBUG   (  795):     r0 00000000  r1 00000000  r2 00000000  r3 fefeff00
I/DEBUG   (  795):     r4 4cc87008  r5 4d79e890  r6 425727c8  r7 00000000
I/DEBUG   (  795):     r8 4cc636bc  r9 40153a4c  sl 417bc2a0  fp 417bc2bc
I/DEBUG   (  795):     ip 4ccb9008  sp 4ce80d78  lr 417b6a6d  pc 417b6acc  cpsr 40000030
I/DEBUG   (  795):     d0  363731366334302e  d1  353665363736396d
I/DEBUG   (  795):     d2  3134303264323070  d3  3536333639366333
I/DEBUG   (  795):     d4  3436323731363336  d5  3337353764366632
I/DEBUG   (  795):     d6  3134663233363936  d7  6336393632373637
I/DEBUG   (  795):     d8  0000000000000000  d9  0000000000000000
I/DEBUG   (  795):     d10 0000000000000000  d11 0000000000000000
I/DEBUG   (  795):     d12 0000000000000000  d13 0000000000000000
I/DEBUG   (  795):     d14 0000000000000000  d15 0000000000000000
I/DEBUG   (  795):     d16 000000000d01e2ee  d17 000000000d01e0fa
I/DEBUG   (  795):     d18 00000000001591fe  d19 0000000000000000
I/DEBUG   (  795):     d20 0000000000000000  d21 0000000000000000
I/DEBUG   (  795):     d22 0000000000000000  d23 0000000000000000
I/DEBUG   (  795):     d24 0000000000000000  d25 0000000000000000
I/DEBUG   (  795):     d26 0000000000000000  d27 0000000000000000
I/DEBUG   (  795):     d28 0000000000000000  d29 0000000000000000
I/DEBUG   (  795):     d30 0000000000000000  d31 0000000000000000
I/DEBUG   (  795):     scr 20000010
I/DEBUG   (  795):
I/DEBUG   (  795): backtrace:
I/DEBUG   (  795):     #00  pc 000d8acc  /system/lib/libmmp.so
I/DEBUG   (  795):     #01  pc 00036d4f  /system/lib/libmmp.so
I/DEBUG   (  795):     #02  pc 00012bb0  /system/lib/libc.so (__thread_entry+48)
I/DEBUG   (  795):     #03  pc 00012308  /system/lib/libc.so (pthread_create+172)
I/DEBUG   (  795):
I/DEBUG   (  795): stack:
I/DEBUG   (  795):          4ce80d38  00000068  
I/DEBUG   (  795):          4ce80d3c  4012de49  /system/lib/libc.so (__system_property_find+56)
I/DEBUG   (  795):          4ce80d40  4ce80d98  [stack:3185]
I/DEBUG   (  795):          4ce80d44  4012de8b  /system/lib/libc.so (__system_property_read+46)
I/DEBUG   (  795):          4ce80d48  c2060a42  
I/DEBUG   (  795):          4ce80d4c  4cc87008  
I/DEBUG   (  795):          4ce80d50  4ce80d98  [stack:3185]
I/DEBUG   (  795):          4ce80d54  00000000  
I/DEBUG   (  795):          4ce80d58  00000000  
I/DEBUG   (  795):          4ce80d5c  4cc636bc  
I/DEBUG   (  795):          4ce80d60  40153a4c  
I/DEBUG   (  795):          4ce80d64  40174573  /system/lib/libcutils.so (property_get+10)
I/DEBUG   (  795):          4ce80d68  4cc87008  
I/DEBUG   (  795):          4ce80d6c  4d79e890  
I/DEBUG   (  795):          4ce80d70  df0027ad  
I/DEBUG   (  795):          4ce80d74  00000000  
I/DEBUG   (  795):     #00  4ce80d78  00000000  
I/DEBUG   (  795):          4ce80d7c  00000000  
I/DEBUG   (  795):          4ce80d80  4014c54c  
I/DEBUG   (  795):          4ce80d84  4011825b  /system/lib/libc.so (dlmalloc+5326)
I/DEBUG   (  795):          4ce80d88  00001000  
I/DEBUG   (  795):          4ce80d8c  00000000  
I/DEBUG   (  795):          4ce80d90  00000000  
I/DEBUG   (  795):          4ce80d94  40153a4c  
I/DEBUG   (  795):          4ce80d98  00000031  
I/DEBUG   (  795):          4ce80d9c  40118571  /system/lib/libc.so (dlfree+56)
I/DEBUG   (  795):          4ce80da0  40118539  /system/lib/libc.so (dlfree)
I/DEBUG   (  795):          4ce80da4  00000000  
I/DEBUG   (  795):          4ce80da8  00000000  
I/DEBUG   (  795):          4ce80dac  00000000  
I/DEBUG   (  795):          4ce80db0  00000001  
I/DEBUG   (  795):          4ce80db4  42270698  
I/DEBUG   (  795):          ........  ........
I/DEBUG   (  795):     #01  4ce80e20  00000000  
I/DEBUG   (  795):          4ce80e24  00000000  
I/DEBUG   (  795):          4ce80e28  00000000  
I/DEBUG   (  795):          4ce80e2c  00000000  
I/DEBUG   (  795):          4ce80e30  00000000  
I/DEBUG   (  795):          4ce80e34  00000000  
I/DEBUG   (  795):          4ce80e38  00000001  
I/DEBUG   (  795):          4ce80e3c  00000001  
I/DEBUG   (  795):          4ce80e40  4d79e890  
I/DEBUG   (  795):          4ce80e44  00000000  
I/DEBUG   (  795):          4ce80e48  00000000  
I/DEBUG   (  795):          4ce80e4c  00000000  
I/DEBUG   (  795):          4ce80e50  417c0a7a  /system/lib/libmmp.so
I/DEBUG   (  795):          4ce80e54  40153a4c  
I/DEBUG   (  795):          4ce80e58  00001005  
I/DEBUG   (  795):          4ce80e5c  00000030  
I/DEBUG   (  795):          ........  ........
I/DEBUG   (  795):     #02  4ce80ef0  422703f0  
I/DEBUG   (  795):          4ce80ef4  4ce80f00  [stack:3185]
I/DEBUG   (  795):          4ce80ef8  be807830  [stack]
I/DEBUG   (  795):          4ce80efc  4011530c  /system/lib/libc.so (pthread_create+176)
I/DEBUG   (  795):
I/DEBUG   (  795): memory near r4:
I/DEBUG   (  795):     4cc86fe8 4cc64fe0 00000001 00000000 00000007  .O.L............
I/DEBUG   (  795):     4cc86ff8 00000007 00000007 00000001 00032ff2  ............./..
I/DEBUG   (  795):     4cc87008 00000000 00000000 00000000 00000000  ................
I/DEBUG   (  795):     4cc87018 00000000 00000000 00000000 00000000  ................
I/DEBUG   (  795):     4cc87028 00000000 00000000 41815700 00000000  .........W.A....
I/DEBUG   (  795):
I/DEBUG   (  795): memory near r5:
I/DEBUG   (  795):     4d79e870 417b3f19 417b6a29 417b4cbd 417b3fb1  .?{A)j{A.L{A.?{A
I/DEBUG   (  795):     4d79e880 417b40ed 417b4241 417b44f1 4cc87008  
[email protected]
{AAB{A.D{A.p.L I/DEBUG ( 795): 4d79e890 00000000 00000000 00000000 00000000 ................ I/DEBUG ( 795): 4d79e8a0 00000000 00000000 00000000 00000000 ................ I/DEBUG ( 795): 4d79e8b0 00000000 00000000 00000000 00000000 ................ I/DEBUG ( 795): I/DEBUG ( 795): memory near r6: I/DEBUG ( 795): 425727a8 425728b0 42572940 4cb4e000 0000008b .(
[email protected]
)WB...L.... I/DEBUG ( 795): 425727b8 00000001 0000006d 4170f4e5 4170f5bb ....m.....pA..pA I/DEBUG ( 795): 425727c8 70747468 312f2f3a 312e3239 312e3836 http://192.168.1 I/DEBUG ( 795): 425727d8 3931312e 3738343a 66322f31 65366436 .119:4871/2f6d6e I/DEBUG ( 795): 425727e8 66323437 34363337 31363336 34363237 742f736463617264 I/DEBUG ( 795):


出現這樣的log資訊,一般都是c或c++程式碼的問題,只看這些log資訊根本無法確定出錯的程式碼。 這些log其實就是程式執行過程中函式呼叫在堆疊中的地址資訊,直接通過那些地址我們是無法得知錯誤出在哪裡,不過我們可以有種方式直接告訴我們是在呼叫庫檔案裡面的哪個函式處出了問題。

除錯過程如下:

1、首先取以上log資訊中的從#00開始連續的那一部分,儲存到一個檔案裡,再次將檔案命名為log.txt 。

  I/DEBUG   (  795):     #00  pc 000d8acc  /system/lib/libmmp.so
  I/DEBUG   (  795):     #01  pc 00036d4f  /system/lib/libmmp.so

儲存到log.txt檔案中

2、使用panic.py解析該檔案。

3、根據返回的資訊除錯程式。

執行該指令碼返回的如下資訊。

read file ok
BFD: Dwarf Error: mangled line number section.
mp4_config2.c:0               init_omx_aud_decoder
BFD: Dwarf Error: mangled line number section.
mp4_config2.c:0               handle_read_rebuffer

從返回的資訊中可以知道錯誤出現在mp4_config2.c檔案中的handle_read_rebuffer和init_omx_aud_decoderchu 這兩個函式

panic.py指令碼

#!/usr/bin/python     
# stack symbol parser     
import os    
import string    
import sys    
    
#define android product name     
ANDROID_PRODUCT_NAME = 'test'    
    
ANDROID_WORKSPACE = os.getcwd()+"/"    
    
# addr2line tool path and symbol path     
addr2line_tool = ANDROID_WORKSPACE + 'prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-addr2line'    
symbol_dir = ANDROID_WORKSPACE + 'out/target/product/' + ANDROID_PRODUCT_NAME +'/symbols'    
symbol_bin = symbol_dir + '/system/bin/'    
symbol_lib = symbol_dir + '/system/lib/'    
    
    
class ReadLog:    
    def __init__(self,filename):    
        self.logname = filename    
    def parse(self):    
        f = file(self.logname,'r')    
        lines = f.readlines()    
        if lines != []:    
            print 'read file ok'    
        else:    
            print 'read file failed'    
        result =[]    
        for line in lines:    
            if line.find('stack') != -1:    
                print 'stop search'    
                break    
            elif line.find('system') != -1:    
                #print 'find one item' + line     
                result.append(line)    
        return result    
    
class ParseContent:    
    def __init__(self,addr,lib):    
            self.address = addr # pc address    
            self.exename = lib  # executable or shared library    
    def addr2line(self):    
        cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address    
        #print cmd     
        stream = os.popen(cmd)    
        lines = stream.readlines();    
        list = map(string.strip,lines)    
        return list    
        
inputarg = sys.argv    
if len(inputarg) < 2:    
    print 'Please input panic log'    
    exit()    
    
filename = inputarg[1]    
readlog = ReadLog(filename)    
inputlist = readlog.parse()    
    
for item in inputlist:    
    itemsplit = item.split()    
    test = ParseContent(itemsplit[-2],itemsplit[-1])    
    list = test.addr2line()    
    print "%-30s%s" % (list[1],list[0])   

注:ANDROID_PRODUCT_NAME 這個變數的值要根據你的專案名來設定,這個值可以在out目錄的子目錄下確定。

out/target/product/test/system  注意紅色字型的位置,就是你們產品的專案名。將紅色字型位置的名字賦給ANDROID_PRODUCT_NAME這個變數就行了。

也要注意arm-eabi-addr2line這個命令的位置,不同版本的android用的arm-eabi的編譯版本不同,根據自己android編譯工具的版本修改所在的目錄

補充:
解決出現 ??:0 , 沒法展示原始碼行數的問題

在Android.mk 檔案中:LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -Wl,-Map=test.map -g 
補充2個編譯引數 

 -Wl,-Map=test.map -g

增加gcc警告和除錯標誌

相關推薦

Android除錯.sobug

在做dlna應用時遇到系統無法播放視訊和音訊檔案,列印了一些debug資訊, I/DEBUG ( 795): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** I/DEBUG ( 7

android除錯3G之Ril分析

一、基本架構概述           Android RIL (Radio Interface Layer)提供了Telephony服務和Radio硬體之間的抽象層。RIL負責資料的可靠傳輸、AT命令

一篇好文之Android 呼叫C程式碼及生成除錯so

不靠譜的朱先生又來了,今天是週五,我又出現了!好了,不為自己多解釋,上週沒發文章,其實我寫了,只是沒有發出來而已……機智ovo。 上週寫的文章是關於GreenDao全面解析,其實當時是想寫一個關於資料庫的系列文章,後來一共就寫了兩篇,SQlite全面解析和GreenDao全面解析。至

Android編譯libx264

編譯指令碼: #!/bin/bash NDK=/home/vbird/workspace/android-ndk-r14b PLATFORM=$NDK/platforms/android-18

Android Studio製作.so實踐

前言 因為工作需要可能要用到JNI開發,本篇文章就分享一下我在這方面的實踐,以前我們使用Eclipse做NDK開發,非常麻煩,需要配cygwin的編譯環境,後面NDK功能完善才逐漸簡單點,如果想了解Eclipse如何配置NDK編譯環境可以參考我以前發表的舊文:

android除錯音效卡驅動之概述

      在Android中音訊系統使用的是ALSA系統架構。ASoC--ALSA System on Chip ,是建立在標準ALSA驅動層上,為了更好地支援 嵌入式處理器和移動裝置中的音訊Cod

Android系統編譯so提示error undefined reference to '__android_log_print問題的解決

在系統原始碼的hardware/qcom下增加psam資料夾,編譯原始碼要生成libpsam.so庫,Android.mk內容 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)   LOCAL_MODULE &n

android除錯音效卡驅動之總結

1、在除錯中出現問題後,首先看I2C通訊有沒有問題,wm8960暫存器的設定是靠I2C來完成,另外I2C通訊不成功在開發板中是沒      有音效卡相關的裝置節點。       a、首先檢視Machi

android除錯音效卡驅動之wm8960介紹二

三、LINPUT輸入通道介紹             有關LINPUT的主要配置如下:            R32的bit8(LMN1)置1:LINPUT1連線PGA;            R0

Android Studio中so的建立與使用、jar(jar呼叫so)的建立與使用(一)

工程下載https://download.csdn.net/download/cnicfhnui/10422621一、Android Studio 建立so庫,呼叫so庫第一步先下載NDK開發包,下載地址:https://developer.android.google.cn

android除錯3G之gpio控制3G上電

      如果是自己開發的板子,需要用GPIO引腳控制3G模組開機/關機時,下面的文章會對你有所幫助,是以處理器IMX6和中興MG3732模組為例介紹。 一、引腳連線        處理器的gpio3_GPIO[9]連線3G模組的ON/OFF(29)引腳來控制3G的開機/

android除錯音效卡驅動之wm8960介紹一

       經過了一段時間的Android下wm8960驅動的除錯,終於實現錄音和播放功能了,在除錯過程中有了一些心得,與大家分享一 下,由於能力有限,錯誤之處還望海涵和指教。 一、總述      

android除錯3G之自動撥號

      本章簡單講述下android實現自動撥號的功能,該功能利用了系統啟動的rild的服務來實現,因為rild的服務是殺不死的,所以利用這一點,可以使撥號失敗或網路斷掉後自動重撥,來增強上網的可靠性。這裡只實現撥號功能,把ril庫實現的一些功能都去掉了。 一、修改ri

android 預置apk so jar包等

LOCAL_PATH := $(call my-dir) 這一行每個Android.mk 都是要新增的 1.預置aliuyi.apk 預製一個普通的apk include $(CLEAR_VARS) LOCAL_MODULE := wwwa.apk  LOCAL_SRC_FILES := aliuyi.ap

Android Studio 對so的操作

1、在本專案中使用本專案生成的so檔案 1、小知識: 1)、as庫的預設位置: 在app/build/intermediates/ndk/debug/lib 2)、ndk的功能是生成so庫,在專案中有底層c程式碼的時候能夠提供jni的環境,使用已經生

android studio 匯入so的簡便方法

AndroidStudio加入so檔案,預設的路徑放置。     如果jniLibs資料夾放在module的根目錄下,需要修改module的build.gradle檔案配置 sourceSets是放在android{}裡面的 sourceSets{ main{ j

Android動態除錯so 使用 gdb + gdbserver 啟動除錯的過程

在網上找了好久才找到一份能按照上面的步驟順利的進行除錯的文件。文件在最後有連結地址。 大概說一些 gdb + gdbserver 在Android 下進行動態除錯so的步驟: 準備工作: 1、找到 gdbserver 並 傳送到手機裡,gdbserver 的位置一般在NDK

Android中的so

Android裝置的CPU型別 目前Android裝置已經支援多種CPU型別,包括: armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以後的生產的大部分Android裝置都

Android動態除錯so之dump記憶體資料

1.配置環境 一臺已root手機 IDA pro6.6 Android SDK 準備工作: 1.1把Android SDK新增到環境變數中 1.2把已root手機的系統中關鍵so拖到本地,必要時可以靜態讀取,獲取系統函式的偏移地址。 例如把手機系統的system/lib的檔案拖到本地debugging資料

cocos2d-LUA逆向之用idaPro除錯so獲取xxtea解密key

    以一個棋牌類app大神.apk為例,,首先我們需要獲取apk裡面的指令碼資源,可以直接用360好壓解壓縮apk安裝包,會得到如下目錄:        其中,lib目錄含有我們需要除錯的so庫檔案,檔名一般是libcocos2dlua.so或帶有cocos字樣,當然也有