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

android調試gdb

發布時間: 2024-04-26 23:22:27

❶ gdb調試命令是什麼

1、對於在應用程序中加入參數進行調試的方法:

直接用 gdb app -p1 -p2 這樣進行調試是不行的。

需要像以下這樣使用:

#gdb app

(gdb) r -p1 -p2

或者在運行run命令前使用set args命令:

(gdb) set args p1 p2

可以用show args 命令來查看

2、加入斷點:

break <linenumber>

break <funcName>

break +offset

break -offset

(在當前行號的前面或後面的offset行停住。)

break filename:linenum

在源文件filename的linenum行處停住。

break filename:function

在源文件filename的function函數的入口處停住。

(1)android調試gdb擴展閱讀:

一般來說,GDB主要幫助完成下面四個方面的功能:

1、啟動程序,可以按照你的自定義的要求隨心所欲的運行程序。

2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)

3、當程序被停住時,可以檢查此時你的程序中所發生的事。

4、可以改變你的程序,將一個BUG產生的影響修正從而測試其他BUG。

❷ 在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等.

❸ 為啥Android下用到的.cpp中的sizeof(wchar_t)佔用四個位元組

暈,打個回車,結果發表了。我重新敘述下問題。我的android工程要用到C++代碼。在cygwin下gdb調試時發現sizeof(wchar_t)的結果是4,我看網上說是可以通過-fshort-wchar 來解決,於是我在mk文件中加入了下面這句話 LOCAL_CPP_FLAGS := -fshort-wchar 但是調試時發現還是佔用4個位元組。而在 Cygwin下通過vi ,新建一個.cpp文件,裡面cout << sizeof(wchar) << endl; 得出的結果卻是2。 求解,先謝謝啦

❹ Android studio 開發app,如何抵抗動態調試,反調試代碼怎麼寫請寫上詳細代碼。

為了保護關鍵代碼被逆向分析,一般放在應用程序初始化過程中,如init_array,或jni_onload函數里進行檢查代碼執行。
1.調試檢測
對調試器的檢測(ida,gdb,strace, ltrace等調試工具)
a.父進程檢測
b.當前運行進程檢測
例如對android_server進程檢測。針對這種檢測只需將android_server改名就可繞過
[objc] view plain
pid_t GetPidByName(const charchar *as_name) {
DIR *pdir = NULL;
struct dirent *pde = NULL;
FILEFILE *pf = NULL;
char buff[128];
pid_t pid;
char szName[128];
// 遍歷/proc目錄下所有pid目錄
pdir = opendir("/proc");
if (!pdir) {
perror("open /proc fail.\n");
return -1;
}
while ((pde = readdir(pdir))) {
if ((pde->d_name[0] < '0') || (pde->d_name[0] > '9')) {
continue;
}
sprintf(buff, "/proc/%s/status", pde->d_name);
pf = fopen(buff, "r");
if (pf) {
fgets(buff, sizeof(buff), pf);
fclose(pf);
sscanf(buff, "%*s %s", szName);
pid = atoi(pde->d_name);
if (strcmp(szName, as_name) == 0) {
closedir(pdir);
return pid;
}
}
}
closedir(pdir);
return 0;
}
c.讀取進程狀態(/proc/pid/status)
State屬性值T 表示調試狀態,TracerPid 屬性值正在調試此進程的pid,在非調試情況下State為S或R, TracerPid等於0

d.讀取 /proc/%d/wchan
下圖中第一個紅色框值為非調試狀態值,第二個紅色框值為調試狀態:

[objc] view plain
static void get_process_status(pid_t pid,const char* info,charchar *outline)
{
FILEFILE *fp;
char filename;
char line = {0};
snprintf( filename, sizeof(filename), "/proc/%d/status", pid );
fp = fopen( filename, "r" );
if ( fp != NULL )
{
while ( fgets( line, sizeof(line), fp ) )
{
if ( strstr( line, info ) )
strcpy(outline,line);
}
fclose( fp ) ;
}
return ;
}
static int getProcessStatus(int pid)
{
char readline = {0};
int result = STATUS_ELSE;
get_process_status(pid,"State",readline);
if(strstr(readline,"R"))
result = STATUS_RUNNING;
else if(strstr(readline,"S"))
result = STATUS_SLEEPING;
else if(strstr(readline,"T"))
result = STATUS_TRACING;
return result;
}
static int getTracerPid(int pid)
{
char readline = {0};
int result = INVALID_PID;
get_process_status(pid,"TracerPid",readline);
charchar *pidnum = strstr(readline,":");
result = atoi(pidnum + 1);
return result;
}
static int getWchanStatus(int pid)
{
FILEFILE *fp= NULL;
char filename;
char wchaninfo = {0};
int result = WCHAN_ELSE;
char cmd = {0};
sprintf(cmd,"cat /proc/%d/wchan",pid);
LOGANTI("cmd= %s",cmd);
FILEFILE *ptr; if((ptr=popen(cmd, "r")) != NULL)
{
if(fgets(wchaninfo, 128, ptr) != NULL)
{
LOGANTI("wchaninfo= %s",wchaninfo);
}
}
if(strncasecmp(wchaninfo,"sys_epoll\0",strlen("sys_epoll\0")) == 0)
result = WCHAN_RUNNING;
else if(strncasecmp(wchaninfo,"ptrace_stop\0",strlen("ptrace_stop\0")) == 0)
result = WCHAN_TRACING;
return result;
}
e. ptrace 自身或者fork子進程相互ptrace
[objc] view plain
ptrace me
if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) {
printf("DEBUGGING... Bye\n");
return 1;
}
void anti_ptrace(void)
{
pid_t child;
child = fork();
if (child)
wait(NULL);
else {
pid_t parent = getppid();
if (ptrace(PTRACE_ATTACH, parent, 0, 0) < 0)
while(1);
sleep(1);
ptrace(PTRACE_DETACH, parent, 0, 0);
exit(0);
}
}
f. 防止mp
利用Inotify機制,對/proc/pid/mem和/proc/pid/pagemap文件進行監視。inotify API提供了監視文件系統的事件機制,可用於監視個體文件,或者監控目錄。具體原理可參考:http://man7.org/linux/man- pages/man7/inotify.7.html
偽代碼:
[objc] view plain
void __fastcall anitInotify(int flag)
{
MemorPagemap = flag;
charchar *pagemap = "/proc/%d/pagemap";
charchar *mem = "/proc/%d/mem";
pagemap_addr = (charchar *)malloc(0x100u);
mem_addr = (charchar *)malloc(0x100u);
ret = sprintf(pagemap_addr, &pagemap, pid_);
ret = sprintf(mem_addr, &mem, pid_);
if ( !MemorPagemap )
{
ret = pthread_create(&th, 0, (voidvoid *(*)(voidvoid *)) inotity_func, mem_addr);
if ( ret >= 0 )
ret = pthread_detach(th);
}
if ( MemorPagemap == 1 )
{
ret = pthread_create(&newthread, 0, (voidvoid *(*)(voidvoid *)) inotity_func, pagemap_addr);
if(ret > 0)
ret = pthread_detach(th);
}
}
void __fastcall __noreturn inotity_func(const charchar *inotity_file)
{
const charchar *name; // r4@1
signed int fd; // r8@1
bool flag; // zf@3
bool ret; // nf@3
ssize_t length; // r10@3
ssize_t i; // r9@7
fd_set readfds; // @2
char event; // @1
name = inotity_file;
memset(buffer, 0, 0x400u);
fd = inotify_init();
inotify_add_watch(fd, name, 0xFFFu);
while ( 1 )
{
do
{
memset(&readfds, 0, 0x80u);
}
while ( select(fd + 1, &readfds, 0, 0, 0) <= 0 );
length = read(fd, event, 0x400u);
flag = length == 0;
ret = length < 0;
if ( length >= 0 )
{
if ( !ret && !flag )
{
i = 0;
do
{
inotity_kill((int)&event);
i += *(_DWORD *)&event + 16;
}
while ( length > i );
}
}
else
{
while ( *(_DWORD *)_errno() == 4 )
{
length = read(fd, buffer, 0x400u);
flag = length == 0;
ret = length < 0;
if ( length >= 0 )
}
}
}
}
g. 對read做hook
因為一般的內存mp都會調用到read函數,所以對read做內存hook,檢測read數據是否在自己需要保護的空間來阻止mp
h. 設置單步調試陷阱
[objc] view plain
int handler()
{
return bsd_signal(5, 0);
}
int set_SIGTRAP()
{
int result;
bsd_signal(5, (int)handler);
result = raise(5);
return result;
}

❺ 如何在Android studio下調試ndk

一: 先看看用 ndk-gdb 手動調試
這種方法只適用於手動編寫 Android.mk 的情況,因為我們要手動 build debug 版本的 .so 文件。具體可以參考我的前一篇文章。
1 AndroidManifest.xml android:debuggable 設置為 true
2 切換到 jni 目錄下執行 ndk-build NDK_DEBUG=1
http://www.cnblogs.com/lesliefang/p/5163148.html

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

創建 assembler工程

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

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

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

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

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

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

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

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

熱點內容
怎麼看台式電腦配置生產日期 發布:2024-05-08 01:32:26 瀏覽:458
java基礎培訓學校 發布:2024-05-08 01:30:44 瀏覽:465
簡單輔助火眼打碼如何配置 發布:2024-05-08 01:30:44 瀏覽:901
我的世界網易版伺服器游戲 發布:2024-05-08 01:10:33 瀏覽:40
csgo中的存儲庫的功能 發布:2024-05-08 01:05:27 瀏覽:277
php旅遊網站系統 發布:2024-05-07 20:27:32 瀏覽:611
jdk源碼怎麼看 發布:2024-05-07 20:18:22 瀏覽:520
編程c語言自學書 發布:2024-05-07 20:12:03 瀏覽:423
usb大容量存儲驅動 發布:2024-05-07 19:02:01 瀏覽:816
紅米1s沒有存儲空間 發布:2024-05-07 18:59:09 瀏覽:506