2025-05-17

一般情況下程序是在某一個點掛掉的,我們可以用adb shell ps查到PID,然後在target端用gdbserver attach上去,最後在host端用gdb連上去調。但程序往往不會崩潰得這麼完美,很多情況下程序一起來就crash掉瞭。這個時候分兩種情況:1.真的是一起來就掛掉的。2.一起來後稍稍過會就掛掉的。

 

這裡我用的系統是:

Host: Ubuntu x64

Target: Android ICS

 

方法一:針對第一種情況。首先在target的Android中運行Dev Tools->Development Settings,點按鈕"None"選擇你要調的程序(這裡比如是flashplayer),然後選中Wait for debugger就可以退出瞭。 


這時候打開要調的程序就會停住:

  

當然,這時候wait for debugger不是wait gdb,是DDMS。但因為我們最後是用gdb調,所以這時候要趁機用gdb attach上去。具體gdb的設置和使用請參見另一博文(/kf/201203/124820.html )。一般情況下你會看到類似於下面的東西:

jzj@jzj-laptop:~/debug$ gdb -x init.gdb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.

__futex_syscall4 () at bionic/libc/arch-x86/bionic/atomics_x86.S:73
73     popl    %esi
Created trace state variable $trace_timestamp for target's variable 1."
(gdb)

gdb啟動後就可以設斷點啊看變量什麼的瞭,設好斷點後輸入continue繼續運行,但就像前面提到的wait for debugger不是wait gdb,所以gdb說continue還不能continue。打開DDMS  

有個紅色蟲子表示停住瞭,點上面綠色蟲子程序就可以繼續運行程序瞭。然後就可以換由gdb控制,盡情調試瞭。

 

方法二:針對第二種情況。用腳本啟動目標程序,然後馬上attach上去。腳本總比人肉輸入快,所以有時候可以用這個方法拼一下看是先crash還是先attach上,優點是比較簡單。下面是個簡單的例子(調的是Adobe reader),註意其中的grep的字符串得看情況而定,現實當中用時可以先把PID打印出來,或者自動判斷下是否唯一。

#!/bin/bash

ACTION=android.intent.action.MAIN
COM=com.adobe.reader/com.adobe.reader.AdobeReader

adb root
adb shell am start -a $ACTION -n $COM
PID=`adb shell ps | grep "reader" | awk '{print $2}'`
CMD="adb shell /data/gdbserver :1234 –attach $PID"
echo $CMD
eval $CMD

摘自  金卓軍的博客@CSDN 

 

摘自  摘自 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *