介绍gdb调试工具

本文介绍Native异常的调试工具gdb的环境准备与常见命令

1. 找到gdbserver

当有Android系统源码,可在/prebuilts目录下查找,一般位于如下:

工具所在源码路径
32位gdb服务端prebuilts/misc/android-arm/gdbserver/gdbserver
64位gdb服务端prebuilts/misc/android-arm64/gdbserver64/gdbserver64
32位gdb客户端prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-gdb
64位gdb客户端prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-gdb
symbols/out/target/product/[name]/symbols

gdbserver64和gdbserver选择哪一个,取决于当前手机是32位还是64位,要判定这个方法很有很多,比如

adb shell getprop ro.product.cpu.abi

2. 环境准备

adb root
adb disable-verity          
adb reboot

adb root
adb remout
adb push prebuilts/misc/android-arm64/gdbserver64/gdbserver64 /system/bin

adb shell setenforce 0

这里有几点需要注意:

  • 如果disable-verity命令不可执行,需要选择源码环境下的adb命令
  • 如果过程遇到selinux权限问题,记得关闭

3. 启动gdbserver服务

服务端操作:

adb shell
gdbserver64 :1234 --attach 1536  //1536代表system_server进程的pid

客户端操作:

adb forward tcp:1234 tcp:1234
aarch64-linux-android-gdb   //提前配置好环境变量
target remote:1234

// 加载被调试的可执行程序
file xxx/out/target/product/[name]/symbols/system/bin/app_process64  
// 设置符号路径
set sysroot  [xxx/symbols] 
//设置源码路径
set dir xxx   

开始调试:

b frameworks/base/core/jni/android_util_Process.cpp:1035 if sig == 19
c

4. 常见gdb调试命令

命令名命令缩写命令说明
backtracebt查看函数调用堆栈
framef查看栈帧
listl查看源码
printp打印内部变量值
infoi查看程序状态
displaydisp跟踪某变量,每次停下来则显示值
runr开始运行程序
continuec继续程序运行,直到下一个断点
breakb设置断点
starts开始执行程序
steps执行下一条语句,若该语句为函数调用,则进入函数内的第一条语句
nextn执行下一条语句,不会进入函数内部执行
watch 监视变量值的变化
file 装入需要调试的程序
set var name=v 设置变量的值
killk杀掉正在调试的程序
quitq退出GDB环境

以下列举部分常见的调试命令:

命令含义
bt打印当前线程调用栈
bt 10打印tid=10的线程调用栈
thread apply all bt打印所有线程的调用栈
f 5切换到调用栈的第5层
t 10切换到tid=10的线程
disassemble查看汇编代码
info reg查看当前的寄存器值
info threads查看当前进程的所有线程
x /32wx 0x7198eb48查看内存
p *(Method*)0x6d682328查看符号
    原文作者:Gityuan
    原文地址: http://gityuan.com/2017/09/09/gdb/
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞