當前位置:首頁 » 安卓系統 » gdb調試android

gdb調試android

發布時間: 2023-01-08 12:43:51

Ⅰ 如何使用gdb調試android程序

用gdb調試動態鏈接庫
大家都知道在 linux 可以用 gdb 來調試應用程序,當然前提是用 gcc 編譯程序時要加上 -g 參數。
我這篇文章里將討論一下用 gdb 來調試動態鏈接庫的問題。
首先,假設我們准備這樣的一個動態鏈接庫:
引用:
庫名稱是: ggg
動態鏈接庫文件名是: libggg.so
頭文件是: get.h
提供這樣兩個函數調用介面:
int get ();
int set (int a);

要生成這樣一個動態鏈接庫,我們首先編寫這樣一個頭文件:
/************關於本文檔********************************************
*filename: get.h
*********************************************************************/
int get ();
int set (int a);
然後准備這樣一個生成動態鏈接庫的源文件:
/************關於本文檔********************************************
*filename: get.cpp
*********************************************************************/
#include
#include "get.h"
static int x=0;
int get ()
{
printf ("get x=%d\n", x);
return x;
}
int set (int a)
{
printf ("set a=%d\n", a);
x = a;
return x;
}
然後我們用 GNU 的 C/C++ 編譯器來生成動態鏈接庫,編譯命令如下:
引用:
g++ get.cpp -shared -g -DDEBUG -o libggg.so
這樣我們就准備好了動態鏈接庫了,下面我們編寫一個應用程序來調用此動態鏈接庫,源代碼如下:
/************關於本文檔********************************************
*filename: pk.cpp
*********************************************************************/
#include
#include "get.h"
int main (int argc, char** argv)
{
int a = 100;
int b = get ();
int c = set (a);
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
return 0;
}
編譯此程序用下列命令,如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,就用下面這條命令:
引用:
g++ pk.cpp -o app -Wall -g -lggg
否則就用下面這條命令:
引用:
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`
下面我們就開始調試上面命令生成的 app 程序吧。如果已經把上面生成的 libggg.so 放到了庫文件搜索路徑指定的文件目錄,比如 /lib 或 /usr/lib 之類的,調試就順利完成,如下:
引用:
#gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main /* 這是在程序的 main 處設置斷點 */
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set /* 這是在程序的 set 處設置斷點 */
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y /* 這里必須選擇 y 調試程序才會跟蹤到動態鏈接庫內部去 */
Breakpoint 2 (set) pending.
(gdb) run /* 開始運行我們的程序,直到遇見斷點時暫停 */
Starting program: /data/example/c/app
Breakpoint 3 at 0xb7f665f8: file get.cpp, line 11.
Pending breakpoint "set" resolved
Breakpoint 1, main (argc=1, argv=0xbfArrayArray0504) at pk.cpp:7
7 int a = 100;
(gdb) n /* 繼續執行程序的下一行代碼 */
8 int b = get ();
(gdb) n /* 程序執行到了我們斷點所在的動態鏈接庫了 */
get x=0
Array int c = set (a);
(gdb) n
Breakpoint 3, set (a=100) at get.cpp:11
11 printf ("set a=%d\n", a);
(gdb) list /* 查看當前代碼行周圍的代碼,證明我們已經跟蹤到動態鏈接庫的源代碼裡面了 */
6 printf ("get x=%d\n", x);
7 return x;
8 }
Array int set (int a)
10 {
11 printf ("set a=%d\n", a);
12 x = a;
13 return x;
14 }
(gdb) n
set a=100
12 x = a;
(gdb) n
13 return x;
(gdb) n
14 }
(gdb) n
main (argc=1, argv=0xbfArrayArray0504) at pk.cpp:10
10 int d = get ();
(gdb) n
get x=100
11 printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
(gdb) n
a=100,b=0,c=100,d=100
12 return 0;
(gdb) c
Continuing.
Program exited normally.
(gdb) quit /* 程序順利執行結束 */
如果我們沒有把動態鏈接庫放到指定目錄,比如/lib裡面,調試就會失敗,過程如下:
引用:
# gdb ./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main
Breakpoint 1 at 0x804853c: file pk.cpp, line 7.
(gdb) b set
Function "set" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (set) pending.
(gdb) run /* 雖然調試操作都一樣,但程序執行失敗 */
Starting program: /data/example/c/app
/data/example/c/app: error while loading shared libraries: libggg.so: cannot open shared object file: No such file or directory
Program exited with code 0177.
(gdb) quit

Ⅱ 簡述-gdb檢測apk是否可以被調試

調試環境:一台root手機或者模擬器,gdb環境
軟體環境:一個名義上貌似已經加固的apk
命令步驟:

1、adb install ...apk
2、
      2.1、adb shell
      2.2、ps查看進程

很多加固平台後,會生成一個子進程

        2.3、gdbserver remote:埠號 --attach:PID

                        ps:不需要安裝什麼gdbserver,android源碼自帶了

                        ps:如果出現提示「檢測到調試器」之類的話,然後app崩潰了,大致可以說明加固是有效的。

        2.4、如果未出現上述ps問題,則繼續
                adb forward tcp:埠號 tcp:埠號

        2.5、找到sdk\ndk下的gdb.exe,運行它,執行命令target remote:埠號,如下,能成功連上的話,基本上說明這個apk是可以被調試的。over

3、然後想怎麼調試就自己寫些JNI搞吧。

Ⅲ 在Android設備上怎麼調試守護進程

其實網上有很多類似的文章,但是你會發現幾乎都不可重現,要麼是細節沒講清楚,要麼是壓根自己沒有真正去試過。這里,我僅給出自己用gdb和gdbserver調試android native code的實際過程,希望對大家有用。

註:以調試mediaserver進程為例.

第一步:你需要下載android,以debug方式編譯,並以生成的image起模擬器或者設備。

第二步:你需要從「http://developer.download.nvidia.com/tegra/files/tegra-gdb-20100430.zip」下載一個gdb,覆蓋到android源碼中gdb對應的位置。

第三步:adb shell到設備,並起gdbserver偵聽目標進程:

adb shell

gdbserver :5039 /system/bin/mediaserver

第四步: 建立pc機和設備的消息連接:

adb forward tcp:5039 tcp:5039

第五步: 使用gdb調試目標進程:

cd android_src

prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gdb out/debug/target/proct/generic/symbols/system/bin/mediaserver

第六步: 設置符號表:

set solib-absolute-prefix /your_android_src_path/out/debug/target/proct/generic/symbols

set solib-search-path /your_android_src_path/out/debug/target/proct/generic/symbols/system/lib

第七步: 使gdb和gdb server建立連接:

target remote :5039

第八步: ok. 現在可以使用gdb的命令進行調試,譬如next\break\step\info thread等.

Ⅳ 如何使用arm-eabi-gdb調試android c/c++程序

1,先下載最新版本的gdb源代碼包,我使用的是gdb-7.6.tar.gz,使用tar命令進行解包(tar -xvzf gdb-7.6.tar.gz),cd進gdb-7.6/gdb目錄,使用vi找到remote.c中的如下代碼:
if(buf_len > 2 * rsa->sizeof_g_packet)
error(_("Remote 'g' packet reply is too long: %s"),rs->buf);
將上面兩行注釋掉,添加如下代碼
if(buf_len > 2 * rsa->sizeof_g_packet)
{
rsa->sizeof_g_packet = buf_len;
for(i = 0; i < gdbarch_num_regs(gdbarch); i++)
{
if(rsa->regs[i].pnum == -1)
continue;
if(rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
使用如下命令對代碼進行配置、編譯和安裝
./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
make
make install
2,gdbserver使用android4.2模擬器中自帶的版本(v7.1)
3,將NDK編譯好的C/C++可執行程序,上傳到模擬器中/data/test目錄下,假設可執行程序的名稱為testHello。
4,使用命令:gdbserver :7000 /data/test/testHello 啟動模擬器端的調試。
5,啟動arm-linux-gdb之前,使用vi打開~/.bash_profile文件,在其中添加:
export PATH=$PATH:/usr/local/arm-gdb/bin,以便在程序的其他目錄可以直接啟動arm-linux-gdb程序
6,cd至ndk編譯好的testHello文件所在目錄
7,使用如下命令進行埠映射:adb forward tcp:7000 tcp:7000,將模擬器的7000埠和本機的7000埠進行映射
8,使用命令:arm-linux-gdb testHello啟動gdb調試
9,使用target remote :7000 鏈接模擬器中gdbserver啟動的服務。
10,自此,我們就可以使用gdb命令進行代碼調試了。

Ⅳ Android逆向-GDB調試無符號so

創建 assembler工程

然後編譯生成test可執行文件

如果是進程已經存在,再去 attach則

可以看到進程test啟動了,pid位19879

-找到需要打斷點的地方
先找到目標進程test(23946)的段基址

段基址為0xaaaaa000,還要找到關心地址偏移,可以用ida反編譯打開看

最後斷點的地址 = 段基址 + 偏移 = 0xaaaaa000 + 0x0000065C

然後就可以看到斷點斷在了0xaaaaa65c,繼續n,下一步調試

可以通過 layout reg打開寄存器窗口

Ⅵ 如何使用jdb調試android的java程序

1)下載jdbshell並編譯

www.limodev.cn/blog/?dl_name=jdbshell.tar.gz

因為我基本上每次一開始都要執行threads變數,所以我在開始wile循環前加了一句話

else
{
close(parent_to_child[0]);
write(parent_to_child[1], "threads\n",strlen("threads\n"));
while(1)
{
int i = 0;
line = readline ("");

...

}

}

編譯後將jdbshell放到~/bin,或者將目錄加到PATH里

出現無法打開readline.h的話,安裝libreadline6和libreadline6-dev

2)仿照gdbclient,在build/envsetup.sh中加入jdbclient函數

function jdbclient()
{
local MY_SRC_PATH="$1"
if [ "$MY_SRC_PATH" ] ; then
MY_SRC_PATH=$1
echo $MY_SRC_PATH
else
echo "ROOT" $OUR_ROOT
MY_SRC_PATH="app_process"
fi

local PORT="$2"
if [ "$PORT" ] ; then
PORT=$2
else
PORT=":9000"
fi

local PID
local PROG="$3"
if [ "$PROG" ] ; then
PID=`pid $3`
echo tcp$PORT jdwp$PID
adb forward "tcp$PORT" "jdwp:$PID"
echo jdbshell -sourcepath $MY_SRC_PATH -attach localhost$PORT
jdbshell -sourcepath $MY_SRC_PATH -attach localhost$PORT
sleep 2
else
echo ""
echo "please specify app you want to debug:"
echo ""
fi
}

3)啟動android模擬器,運行瀏覽器

4)jdbclient packets/app/Browser/src/ :9000 browser
第一個參數是你要load進來的代碼的地址,如果你要load多個代碼(調試的時候可以看),可以
export DEBUG_SRC_PATH=
然後
jdbclient $DEBUG_SRC_PATH :9000 browser

第二個參數是attach埠,如果9000有在用,可以用其他埠
第三個參數是要調試的應用,腳本裡面根據
pid browser來取得進程id,所以你要保證
adb shell ps |grep browser
能夠看到對應的進程

Ⅶ ndk-gdb --start調試 S4 Android 5.0.1 無法debug

解決方法來自:https://groups.google.com/forum/#!msg/android-ndk/_4JNdY_h558/vdzP-4CkQrUJ
接下來,將按照如下步驟來調試。
1、啟動Cygwin Terminal.
2、進入hello-jni的Android工程目錄
$ cd $ANDROID_NDK_ROOT/samples/hello-jni
3、以調試模式構建c/c++程序,目的是生成共享庫,.so文件
$ ndk-build NDK_DEBUG=1

這里我們使用 ndk-build NDK_DEBUG=1 生成帶符號表的 .so
修改AndroidManifest.xml,設置android:debuggable=true。
注意:從上面執行的結果可看到,除了得到編譯的動態共享庫,還有Gdbserver和Gdbsetup。如果不是設置為調試模式不會產生這兩個文件。

Ⅷ gdb調試命令是什麼

gdb調試命令如下:

1、啟動gdb

$gdb

這樣可以和gdb進行交互了。

2、啟動gdb,並且分屏顯示源代碼

$gdb -tui

這樣,使用了'-tui'選項,啟動可以直接將屏幕分成兩個部分,上面顯示源代碼,比用list方便多了。這時候使用上下方向鍵可以查看源代碼,想要命令行使用上下鍵就用[Ctrl]n和[Ctrl]p。

3、啟動gdb調試指定程序app

$gdb app

這樣就在啟動gdb之後直接載入了app可執行程序,需要注意的是,載入的app程序必須在編譯的時候有gdb調試選項,例如'gcc -g app app.c',注意,如果修改了程序的源代碼,但是沒有編譯,那麼在gdb中顯示的會是改動後的源代碼,但是運行的是改動前的程序,這樣會導致跟蹤錯亂的。

4、啟動程序之後,再用gdb調試

$gdb <program> <PID>

這里,<program>是程序的可執行文件名,<PID>是要調試程序的PID.如果你的程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,並調試他。program應該在PATH環境變數中搜索得到。

5、啟動程序之後,再啟動gdb調試

$gdb <PID>

這里,程序是一個服務程序,那麼你可以指定這個服務程序運行時的進程ID,<PID>是要調試程序的PID.這樣gdb就附加到程序上了,但是現在還沒法查看源代碼,用file命令指明可執行文件就可以顯示源代碼了。

Ⅸ GDB Android

gdb位置:

SDKPATH\ndk-bundle\prebuilt\windows-x86_64

gdbserver位置:

SDKPATH\ndk-bundle\prebuilt\對應的架構

1.啟動App(也可以以調試方式啟動)

adb shell am start -D -n packagename/packagename+activity

2.搜索目標App pid

adb shell ps | findstr "packagename"

3 埠轉發

adb forward tcp:port tcp:port

4 啟動gdbserver 並且attach目標

./gdbserver :port --attach apppid

5 PC埠啟動gdb(雙擊exe)

輸入target remote :port

本文中所有port應該一致

熱點內容
扁桃玩的伺服器地址 發布:2025-05-17 12:18:25 瀏覽:507
u盤上傳歌 發布:2025-05-17 12:14:51 瀏覽:612
入門c語言設計 發布:2025-05-17 12:08:31 瀏覽:40
c3演算法 發布:2025-05-17 12:04:19 瀏覽:364
phprecv 發布:2025-05-17 11:55:00 瀏覽:610
福建時鍾監控網關伺服器雲主機 發布:2025-05-17 11:54:28 瀏覽:248
c資料庫壓縮 發布:2025-05-17 11:39:22 瀏覽:960
安卓手機如何連接音響功放 發布:2025-05-17 11:37:48 瀏覽:959
破解exe加密視頻 發布:2025-05-17 11:23:41 瀏覽:976
我的世界伺服器圈太大了怎麼辦 發布:2025-05-17 11:15:21 瀏覽:615