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下除錯.so庫類的bug
在做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字樣,當然也有