GDB-4——Android设备中使用GDB调试程序的例子
一、一个简单的例子
1. 实验Demo
(1) Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= mytest.c LOCAL_MODULE:= mytest LOCAL_C_FLAGS += -g -O0 LOCAL_SHARED_LIBRARIES := libc include $(BUILD_EXECUTABLE)
(2) 测试程序
1 #include <stdio.h> 2 #include <unistd.h> 3 4 static void my_sleep_func(void) { 5 int i; 6 7 for(i = 0; i < 10; i++) { 8 usleep(5000); 9 } 10 } 11 12 int main() 13 { 14 15 int *p = NULL; 16 17 printf("Hello World!\n"); 18 19 my_sleep_func(); 20 21 *p = 110; //dump 22 23 return 0; 24 }
2. out目录下生成的可用文件
obj/EXECUTABLES/mytest_intermediates/LINKED/mytest //OK obj/EXECUTABLES/mytest_intermediates/mytest //不能用,list 命令显示"No symbol table is loaded" symbols/system/bin/mytest //OK system/bin/mytest //不能用,list 命令显示"No symbol table is loaded"
使用md5sum查看,第一个和第三个的hash值相同,第二个和第四个的hash值相同。
3. 实验示范
先将编译生成的 mytest 可执行elf文件push到设备的 /data/local/tmp 目录下,然后将测试文件也push到这个目录下。然后启动 adeb,使用其中的 gdb 工具进行调试。
root@localhost:/data/local/tmp# gdb mytest_1 (gdb) l 3 vendor/poo/frameworks/cmd/mytest/mytest.c: No such file or directory. //若没有将.c文件放到当前目录或 (gdb) show dir Source directories searched: $cdir:$cwd //应该是表示compile dir 和 current dir为两个默认的源文件搜索路径 (gdb) b 15 Breakpoint 1 at 0x1064: file vendor/poo/frameworks/cmd/mytest/mytest.c, line 17. //和源文件行号对应不上,b 15却显示的是17 (gdb) r Starting program: /data/local/tmp/mytest_1 Breakpoint 1, main () at vendor/poo/frameworks/cmd/mytest/mytest.c:17 17 printf("Hello World!\n"); (gdb) c Continuing. Hello World! //输出后就正常oops死机了
二、交叉调试
1. 使用gdb在主机上调试设备机的vmlinux内核
$ ./aarch64-linux-gnu-gdb /.../kernel-5.10/vmlinux (gdb) p sizeof(struct task_struct) $19 = 4736 (gdb) p sizeof(struct raw_spinlock) $20 = 4
打印一些结构体的大小挺方便的,但是不能设置断点后run,会报"Don't know how to run"。gdb一个运行在客户机上的ko文件也是可以的。
posted on 2022-11-08 11:54 Hello-World3 阅读(445) 评论(0) 编辑 收藏 举报