LLDB 常用命令

较常用的命令都会带 ⭐️ ⭐️ ⭐️

执行命令

LLDB
启动一个没有参数的进程(Xcode断点时相当于执行 run 相当 Com+R)
(lldb) process launch
(lldb) run
(lldb) r
启动一个带参数的进程
(lldb) process launch -- <args>
(lldb) r <args>
在当前选择的线程中执行源级单个步骤,会进入了函数里面
(lldb) thread step-in
(lldb) step
(lldb) s
⭐️ 在当前选择的线程中执行源级单步操作
(lldb) thread step-over
(lldb) next
(lldb) n
⭐️ 在当前选择的线程中执行一个指令级的单步操作,si会单步进入汇编指令的子函数内部,ni 不会
(lldb) thread step-inst
(lldb) si
⭐️ 在当前选择的线程中执行一个指令级的单步操作
(lldb) thread step-inst-over
(lldb) ni
退出当前选定的帧
(lldb) thread step-out
(lldb) finish
⭐️ 立即从当前选定的帧返回,并带有可选的返回值
(lldb) thread return <RETURN EXPRESSION>
设置每次停止时,执行指定的操作
(lldb) target stop-hook add
Enter your stop hook command(s). Type 'DONE' to end.
> bt
> disassemble --pc
> DONE
Stop hook #1 added.
运行到当前函数的第12行,或离开当前函数为止
(lldb) thread until 12

断点命令

LLDB
在 main 方法上设置断点
(lldb) breakpoint set --name main
(lldb) br s -n main
(lldb) b main
在指定文件和指定行上设置断点
(lldb) breakpoint set --file test.c --line 12
(lldb) br s -f test.c -l 12 (lldb) b test.c:12
设置 C++ 方法的断点
(lldb) breakpoint set --method main
(lldb) br s -M main
给一个 oc 方法添加断点
(lldb) breakpoint set --name "-[NSString stringWithFormat:]"
(lldb) b -[NSString stringWithFormat:]
给一个 oc 方法添加断点
(lldb) breakpoint set --selector count
(lldb) br s -S count
通过正则表达式在函数名上设置断点
(lldb) breakpoint set --func-regex regular-expression
(lldb) br s -r regular-expression
通过指定文件和行数来设置断点
(lldb) settings set target.inline-breakpoint-strategy always
(lldb) br s -f foo.c -l 12
通过正则表达式对源文件内容设置断点
(lldb) breakpoint set --source-pattern regular-expression --file SourceFile
(lldb) br s -p regular-expression -f file
设置条件断点
(lldb) breakpoint set --name foo --condition '(int)strcmp(y,"hello") == 0'
(lldb) br s -n foo -c '(int)strcmp(y,"hello") == 0'
获取断点列表
(lldb) breakpoint list
(lldb) br l
删除一个断点
(lldb) breakpoint delete 1
(lldb) br del 1

watchpoint 命令

LLDB
⭐️ 观察一个属性的变化
(lldb) watchpoint set variable varName
(lldb) wa s v varName
⭐️ 观察一个指针
(lldb) watchpoint set expression -- my_ptr
(lldb) wa s e -- my_ptr
设置观察点的条件
(lldb) watch set var global
(lldb) watchpoint modify -c '(global==5)'
(lldb) c ...
(lldb) bt * thread #1: tid = 0x1c03, 0x0000000100000ef5 a.outmodify + 21 at main.cpp:16, stop reason = watchpoint 1 frame #0: 0x0000000100000ef5 a.outmodify + 21 at main.cpp:16 frame #1: 0x0000000100000eac a.outmain + 108 at main.cpp:25 frame #2: 0x00007fff8ac9c7e1 libdyld.dylibstart + 1
(lldb) frame var global (int32_t) global = 5
所有 watchpoint 列表
(lldb) watchpoint list
(lldb) watch l
删除一个 watchpoint
(lldb) watchpoint delete 1
(lldb) watch del 1

查看变量

LLDB
⭐️ 显示当前帧的参数和局部变量
(lldb) frame variable
(lldb) fr v
⭐️ 显示当前帧的局部变量
(lldb) frame variable --no-args
(lldb) fr v -a
⭐️ 显示局部变量的内容
(lldb) frame variable bar
(lldb) fr v bar
(lldb) p bar
显示格式化为十六进制的局部变量的内容
(lldb) frame variable --format x bar
(lldb) fr v -f x bar
显示全局变量的内容。
(lldb) target variable varName
(lldb) ta v varName
⭐️ 显示当前源文件中定义的全局/静态变量
(lldb) target variable
(lldb) ta v
每次停止时显示变量“argc”和“argv”
(lldb) target stop-hook add --one-liner "frame variable argc argv"
(lldb) ta st a -o "fr v argc argv"
(lldb) display argc
(lldb) display argv
当在main函数断点时,显示 argc 和 argv 参数
(lldb) target stop-hook add --name main --one-liner "frame variable argc argv"
(lldb) ta st a -n main -o "fr v argc argv"
当断点停在在 C 实现的 MyClass 时,展示成变量 this
(lldb) target stop-hook add --classname MyClass --one-liner "frame variable this"
(lldb)* ta st a -c MyClass -o "fr v *this"

执行表达式

LLDB
计算当前帧中的广义表达式
(lldb) expr (int) printf ("Print nine: %d.", 4 + 5)
(lldb) print (int) printf ("Print nine: %d.", 4 + 5)
⭐️ 新增一个便捷变量并赋值
(lldb) expr unsigned int $foo = 5
⭐️ 打印对象的描述
(lldb) expr -o -- [SomeClass returnAnObject]
(lldb) po [SomeClass returnAnObject]
打印表达式结果的动态类型。
(lldb) expr -d 1 -- [SomeClass returnAnObject]
⭐️ 调用一个函数,以便可以在函数的断点处停止。
(lldb) expr -i 0 — [self xxxxx]
⭐️ 调用崩溃的函数,并在函数崩溃时停止。
(lldb) expr -u 0 — [self xxxxx]

检查线程状态

LLDB
⭐️ 程序中的线程列表
(lldb) thread list
选择线程1作为后续命令的默认线程
(lldb) thread select 1
(lldb) t 1
⭐️ 显示当前线程的堆栈回溯
(lldb) thread backtrace
(lldb) bt
显示所有线程的堆栈回溯
(lldb) thread backtrace all
(lldb) bt all
回溯当前线程的前五帧
(lldb) thread backtrace -c 5
(lldb) bt 5
(lldb) bt -c 5
按索引为当前线程选择不同的堆栈帧
(lldb) frame select 12
(lldb) fr s 12
(lldb) f 12
列出当前线程中当前选定帧的相关信息
(lldb) frame info
选择当前堆栈帧的上一个堆栈帧
(lldb) up
(lldb) frame select --relative=1
选择当前堆栈帧的下一个堆栈帧
(lldb) down
(lldb) frame select --relative=-1
(lldb) fr s -r-1
使用相对偏移量选择不同的堆栈帧。
(lldb) frame select --relative 2
(lldb) fr s -r2
(lldb) frame select --relative -3
(lldb) fr s -r-3
显示当前线程的通用寄存器。
(lldb) register read
修改寄存器 rax 的值
(lldb) register write rax 123
跳过当前程序计数器(指令指针)之前的8个字节。注意,我们使用反引号来计算表达式并将标量结果插入LLDB。
(lldb) register write pc `$pc+8``
显示当前线程的通用寄存器,其格式为带符号的十进制
(lldb) register read --format i
(lldb) re r -f i
显示当前线程的所有寄存器
(lldb) register read --all
(lldb) re r -a
显示当前线程中名为“rax”、“rsp”和“rbp”的寄存器的值。
(lldb) register read rax rsp rbp
显示当前线程中名为“rax”的寄存器的值,其格式为binary
(lldb) register read --format binary rax
(lldb) re r -f b rax
从地址0xbffff3c0读取内存,并显示4个十六进制uint32_t值。
(lldb) memory read --size 4 --format x --count 4 0xbffff3c0
(lldb) me r -s4 -fx -c4 0xbffff3c0
(lldb) x -s4 -fx -c4 0xbffff3c0
从表达式“argv[0]”开始读取内存。
(lldb) memory read argv[0]
(lldb) memory read --size sizeof(int) argv[0]
从地址0xbffff3c0读取512字节的内存,并将结果保存为text的本地文件。
(lldb) memory read --outfile /tmp/mem.txt --count 512 0xbffff3c0
(lldb) me r -o/tmp/mem.txt -c512 0xbffff3c0
(lldb) x/512bx -o/tmp/mem.txt 0xbffff3c0
将从0x1000开始并以0x2000结尾的二进制内存数据保存到文件中。
(lldb) memory read --outfile /tmp/mem.bin --binary 0x1000 0x2000
(lldb) me r -o /tmp/mem.bin -b 0x1000 0x2000
获取关于特定堆分配的信息(仅在Mac OS X上可用)。
(lldb) command script import lldb.macosx.heap
(lldb) process launch --environment MallocStackLogging=1 -- [ARGS]
(lldb) malloc_info --stack-history 0x10010d680
获取有关特定堆分配的信息,并将结果转换为可推断的任何动态类型(仅在Mac OS X上可用)
(lldb) command script import lldb.macosx.heap
(lldb) malloc_info --type 0x10010d680
查找包含由表达式EXPR指定的指针的所有堆块(仅在Mac OS X上可用)。
(lldb) command script import lldb.macosx.heap
(lldb) ptr_refs EXPR
查找块中任何位置包含C字符串的所有堆块
(lldb) command script import lldb.macosx.heap
(lldb) cstr_refs CSTRING
反汇编当前断点所在函数
(lldb) disassemble --frame
(lldb) di -f
反汇编指名字的函数
(lldb) disassemble --name main
(lldb) di -n main
反汇编指定范围代码
(lldb) disassemble --start-address 0x1eb8 --end-address 0x1ec3
(lldb) di -s 0x1eb8 -e 0x1ec3
从指定地址开始反汇编
(lldb) disassemble --start-address 0x1eb8 --count 20
(lldb) di -s 0x1eb8 -c 20
当前函数的混合源和反汇编
(lldb) disassemble --frame --mixed
(lldb) di -f -m
反汇编当前函数并显示操作码字节
(lldb) disassemble --frame --bytes
(lldb) di -f -b
反编译当前行
(lldb) disassemble --line
(lldb) di -l

可执行文件和共享库查询命令

LLDB
列出主要的可执行文件和所有依赖的共享库
⭐️ (lldb) image list
⭐️ 在可执行文件或任何共享库中查找原始地址信息
(lldb) image lookup --address 0x1ec4
(lldb) im loo -a 0x1ec4
查找二进制中匹配正则表达式的函数
This one finds debug symbols:
(lldb) image lookup -r -n <FUNC_REGEX>
This one finds non-debug symbols:
(lldb) image lookup -r -s <FUNC_REGEX>
查找完整的源代码行信息
(lldb) image lookup -v --address 0x1ec4
在 a.out 找看指定地址内容
(lldb) image lookup --address 0x1ec4 a.out
(lldb) im loo -a 0x1ec4 a.out
⭐️ 根据名称查找类型“Point”的信息。
(lldb) image lookup --type Point
(lldb) im loo -t Point
转储主可执行文件和任何共享库中的所有部分。
(lldb) image dump sections
转储主可执行文件和任何共享库中的所有部分到a.out
(lldb) image dump sections a.out
从主可执行文件和任何共享库中转储所有符号
(lldb) image dump symtab
从主可执行文件和任何共享库中转储所有符号到a.outliba.so
(lldb) image dump symtab a.out liba.so
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 简介 LLDB 是新一代高性能调试器. 它是由一组可重用组件的构成, 这些组件大多是 LLVM 工程中的类库,比如...
    O2Space_Xiu阅读 8,603评论 0 4
  • LLDB是个开源的内置于XCode的调试工具,这里来理一理常用用法。lldb对于命令的简称,是头部匹配方式,只要不...
    小小棒棒糖阅读 14,764评论 6 94
  • LLDB命令的语法有其通用结构,通常是以下形式的: [ [ ...]] [-options [option...
    晏zi阅读 875评论 0 49
  • 打印值、修改值、调用方法 p、po 打印值po:输出值p:输出值+值类型+引用名+内存地址(xcode中有内存地址...
    Crazy2015阅读 2,421评论 0 1
  • 断点中止时,在Xcode底部调试窗口(如果没有显示按上图标示位置打开)敲入以下命令: po:打印变量信息, 会调用...
    溪石iOS阅读 421评论 0 5