LLDB-调试

远程调试Android Device

Android端启动lldb server

在此之前将lldb server push到设备,如/data/loca/tmp

shell 复制代码
lldb-server platform \
--server --listen unix-abstract:///data/local/tmp/debug.sock

后台运行:

shell 复制代码
lldb-server platform \
--server --listen unix-abstract:///data/local/tmp/debug.sock &

Host端连接lldb server

在此之前必须先通过adb连接上Android

$ lldb # 启动lldb

shell 复制代码
(lldb) platform select remote-android # 选择远程调试Android
  Platform: remote-android
 Connected: no

 (lldb) platform connect unix-abstract-connect:///data/local/tmp/debug.sock # 连接lldb server
  Platform: remote-android
    Triple: arm-*-linux-android
OS Version: 29.0.0 (4.14.141+)
    Kernel: #27 SMP PREEMPT Mon Mar 14 18:24:42 CST 2020
  Hostname: localhost
 Connected: yes
WorkingDir: /data/local/tmp

Host端附加remote Android进程

附加进程(PID)

shell 复制代码
(lldb) process attach -p 1
Process 1 stopped
* thread #1, name = 'init', stop reason = signal SIGSTOP
    frame #0: 0xffffffffffffffff

Architecture set to: arm--linux-android.

breakpoint调试断点

指定文件和行号设置断点:

shell 复制代码
breakpoint set --file abort.c --line 12
breakpoint set -f syscall.S -l 12

指定函数名称设置断点:

shell 复制代码
breakpoint set --name abort
breakpoint set -n assert

指定函数名规则匹配:

shell 复制代码
breakpoint set --func-regex abort

指定地址:

shell 复制代码
breakpoint set --address 0xf2dbd03e
breakpoint set -a 0xf2dbd03e

指定库

shell 复制代码
breakpoint set --shlib liblog.so --name _log

查看已经设置的断点,注意看输出信息包含断点是否成功命中、是否enable、进程中有多少个位置命中断点:

shell 复制代码
(lldb) breakpoint list
1
禁用、启用、删除断点:
(lldb) breakpoint disable 1 # 对断点1进行操作
(lldb) breakpoint enable 1
(lldb) breakpoint delete 1
(lldb) breakpoint delete all # 删除所有断点
1
2
3
4
thread线程操作/backtrace/bt
thread list
thread backtrace
bt # 上一条命令的简写
thread backtrace all
thread select n # 选择指定的线程号

thread continue/continue/c
thread step-over/next/n
thread step-into/step/s
thread step-out/finish
thread return 10
shell 复制代码
frame栈帧操作
frame info
frame select n # 选择栈帧
frame up # 向上一层栈帧
frame down
frame variable # 打印当前栈帧的变量
1
2
3
4
5
image镜像操作
列出进程加载的库

image list
1
查找指定的地址信息

image lookup --type
image lookup -t

image lookup --name
image lookup -n

image lookup --address
image lookup -a
1
2
3
4
5
6
7
8
通过函数名或符号名查找对应的地址

image lookup -r -n <FUNC_REGEX> # 有符号时使用
image lookup -r -s <FUNC_REGEX> # 无符号时使用
1
2
dump

image dump sections
image dump sym
1
2
watchpoint调试断点
针对变量、内存地址进行设置:

watchpoint set variable valName # 代码中的变量名
watchpoint set variable self->_dataArray
watchpoint set expression 0x14AD6A70
1
2
3
在此基础上添加条件(Read、Write):

watchpoint set expression -w read -- 0x16aabbcc # 内存地址 注意--
watchpoint set expression -w write -- 0x16aabbcc
1
2
条件断点:

watchpoint modify -c '*(int *)0x10aabbcc == 1'
1
watchpoint list
watchpoint delete i
watchpoint delete all
1
2
3
流程控制
r     # run
run   # 运行程序
c     # process continue
process continue      # 继续
process interupt      # 暂停
s     # strp
step    # 源码级别的单步执行/进入函数
stepi   # 汇编指令级别的单步执行/进入函数
next    # 同step但不进入函数
nexti   # 同stepi但不进入函数
finish  # 完成执行当前函数(执行完成当前函数的所有剩余指令并退出到上一级)
return  # 直接退出当前函数,可以指定返回值
1
2
3
4
5
6
7
8
9
10
11
12
memory内存操作
memory read [起始地址 结束地址]/寄存器 -outfile 输出路径(内存操作)

memory read $pc
1
Memory操作比较复杂,建议直接查看官方手册或Cheat Sheet。

disassemble:显示汇编代码
disassemble -b
disassemble --frame
disassemble --name func_name
disassemble -a address
disassemble -s address
d # 这三行都是等价简写
di
dis
1
2
3
4
5
6
7
8
register寄存器操作
读写寄存器:

register read
register read r0
register write r10 1 # 寄存器名称 写入值
1
2
3
expression/print
打印指定变量或表达式。

简写po,等同于expression -O。

print根据变量名打印值。

display变量观察列表
display:类似IDE提供的watch list。每次单步执行后都会打印出指定的表达式的值。
display expr
display list
undisplay n
1
2
3
help
(lldb) help

(lldb) help frame
1
2
3
···
相关推荐
努力努力再努力wz1 小时前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
凤年徐1 小时前
【C++】string的模拟实现
c语言·开发语言·c++
牟同學1 小时前
从赌场到AI:期望值如何用C++改变世界?
c++·人工智能·概率论
夜晚中的人海2 小时前
【C++】智能指针介绍
android·java·c++
chennn122 小时前
c++相关学习
开发语言·c++·学习
m0_552200823 小时前
《UE5_C++多人TPS完整教程》学习笔记61 ——《P62 武器开火特效(Fire Weapon Effects)》
c++·游戏·ue5
AA陈超3 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-04 使用效果应用游戏标签
c++·游戏·ue5·游戏引擎·虚幻
澄澈i5 小时前
CMake学习篇[3]---CMake进阶+嵌套CMakeLists+多层级关系
c++·学习·cmake
杨小码不BUG6 小时前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制
草莓熊Lotso6 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list