gdb调试命令和GDB 到 LLDB 命令映射
文章目录
- gdb调试命令
- GDB 到 LLDB 命令映射
- 执行命令
- 断点命令
- 观察点命令
- 检查变量
- 表达式求值
- 检查线程状态
- 可执行文件和共享库查询命令
- 各种各样的
gdb调试命令
很久之前在网上预览, 总结都很棒留下的, 其源头不知, 如有知晓的可以说明,以便添加.

GDB 到 LLDB 命令映射
参考LLDB官网
下表列出了 GDB 命令及其对应的 LLDB 命令。此外,还列出了 LLDB 中内置的 GDB 兼容别名。完整的 lldb 命令名称通常很长,但可以使用任何独特的缩写形式。除了“ breakpoint set ”,也可以使用“ br se ” 。
执行命令
启动一个无参数的进程
(gdb) run
(gdb) r
(lldb) process launch
(lldb) run
(lldb) r
使用参数启动进程
(gdb) run <args>
(gdb) r <args>
(lldb) process launch -- <args>
(lldb) run <args>
(lldb) r <args>
通过将参数传递给调试器来启动a.out带有参数的进程1 2 3
% gdb --args a.out 1 2 3
(gdb) run
...
(gdb) run
...
% lldb -- a.out 1 2 3
(lldb) run
...
(lldb) run
...
通过在调试器中设置参数来启动带有参数的进程 a.out #1 2 3
(gdb) set args 1 2 3
(gdb) run
...
(gdb) run
...
(lldb) settings set target.run-args 1 2 3
(lldb) run
...
(lldb) run
...
在新终端窗口中使用参数启动进程(仅限 macOS)#
(lldb) process launch --tty -- <args>
(lldb) pro la -t -- <args>
在现有终端中使用参数启动进程/dev/ttys006#
(lldb) process launch --tty=/dev/ttys006 -- <args>
(lldb) pro la -t/dev/ttys006 -- <args>
启动前设置进程的环境变量
(gdb) set env DEBUG 1
(lldb) settings set target.env-vars DEBUG=1
(lldb) set se target.env-vars DEBUG=1
(lldb) env DEBUG=1
启动前取消设置进程的环境变量
(gdb) unset env DEBUG
(lldb) settings remove target.env-vars DEBUG
(lldb) set rem target.env-vars DEBUG
显示在运行时将要或已经传递给程序的参数#
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 3".
(lldb) settings show target.run-args
target.run-args (array of strings) =
[0]: "1"
[1]: "2"
[2]: "3"
在一个命令中设置进程的环境变量并启动进程
(lldb) process launch -E DEBUG=1
附加到进程 ID 为 123 的进程#
(gdb) attach 123
(lldb) process attach --pid 123
(lldb) attach -p 123
附加到名为#的进程a.out
(gdb) attach a.out
(lldb) process attach --name a.out
(lldb) pro at -n a.out
等待名为a.out启动并附加的进程
(gdb) attach -waitfor a.out
(lldb) process attach --name a.out --waitfor
(lldb) pro at -n a.out -w
连接到在系统上运行的远程 gdb 协议服务器eorgadd,端口8000
(gdb) target remote eorgadd:8000
(lldb) gdb-remote eorgadd:8000
连接到本地系统上运行的远程 gdb 协议服务器,端口8000
(gdb) target remote localhost:8000
(lldb) gdb-remote 8000
在系统上以 kdp 模式连接到 Darwin 内核eorgadd
(gdb) kdp-reattach eorgadd
(lldb) kdp-remote eorgadd
在当前选定的线程中执行源级单步
(gdb) step
(gdb) s
(lldb) thread step-in
(lldb) step
(lldb) s
在执行源级单步执行时忽略某个函数
(gdb) skip abc
单步进时将跳过函数 abc。
(lldb) settings show target.process.thread.step-avoid-regexp
target.process.thread.step-avoid-regexp (regex) = ^std::
(lldb) settings set target.process.thread.step-avoid-regexp ^std:: | ^abc
您可以使用以下方式忽略某个函数:
(lldb) thread step-in -r ^abc
或者你可以做相反的事情,只进入与特定名称匹配的函数:
#如果 abc 是函数名的子串,则进入.
(lldb) sif abc
#这相当于:
(lldb) thread step-in -t abc
thread step-in有更多选项,涵盖了 的一些skip其他功能。详情请参阅。help thread step-in
在当前选定的线程中执行源级单步执行#
(gdb) next
(gdb) n
(lldb) thread step-over
(lldb) next
(lldb) n
在当前选定的线程中执行指令级单步
(gdb) stepi
(gdb) si
(lldb) thread step-inst
(lldb) si
在当前选定的线程中执行指令级单步执行
(gdb) nexti
(gdb) ni
(lldb) thread step-inst-over
(lldb) ni
退出当前选定的框架
(gdb) finish
(lldb) thread step-out
(lldb) finish
从当前选定的帧立即返回,并带有可选的返回值
(gdb) return <RETURN EXPRESSION>
(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 行或控制离开当前函数#
(gdb) until 12
(lldb) thread until 12
显示当前框架和源代码行
(gdb) frame
(lldb) frame select
(lldb) f
(lldb) process status
断点命令
在所有名为 main 的函数上设置断点
(gdb) break main
(lldb) breakpoint set --name main
(lldb) br s -n main
(lldb) b main
test.c在文件第#行设置断点12
(gdb) break test.c:12
(lldb) breakpoint set --file test.c --line 12
(lldb) br s -f test.c -l 12
(lldb) b test.c:12
在所有基本名称为#的 C++ 方法上设置断点main
(gdb) break main
(Hope that there are no C functions named main)
(lldb) breakpoint set --method main
(lldb) br s -M main
在 Objective-C函数中设置断点-[NSString stringWithFormat:]
(gdb) break -[NSString stringWithFormat:]
(lldb) breakpoint set --name "-[NSString stringWithFormat:]"
(lldb) b -[NSString stringWithFormat:]
在所有选择器为#的 Objective-C 方法上设置断点count
(gdb) break count
(Hope that there are no C or C++ functions named count)
(lldb) breakpoint set --selector count
(lldb) br s -S count
通过函数名的正则表达式设置断点
(gdb) rbreak regular-expression
(lldb) breakpoint set --func-regex regular-expression
(lldb) br s -r regular-expression
确保文件和行的断点对文件有效##include .c/.cpp/.m
(gdb) b foo.c:12
(lldb) settings set target.inline-breakpoint-strategy always
(lldb) br s -f foo.c -l 12
通过正则表达式在源文件内容上设置断点
(gdb) shell grep -e -n pattern source-file
(gdb) break source-file:CopyLineNumbers
(lldb) breakpoint set --source-pattern regular-expression --file SourceFile
(lldb) br s -p regular-expression -f file
设置条件断点
(gdb) break foo if strcmp(y,"hello") == 0
(lldb) breakpoint set --name foo --condition '(int)strcmp(y,"hello") == 0'
(lldb) br s -n foo -c '(int)strcmp(y,"hello") == 0'
列出所有断点
(gdb) info break
(lldb) breakpoint list
(lldb) br l
删除断点
(gdb) delete 1
(lldb) breakpoint delete 1
(lldb) br del 1
禁用断点
(gdb) disable 1
(lldb) breakpoint disable 1
(lldb) br dis 1
启用断点
(gdb) enable 1
(lldb) breakpoint enable 1
(lldb) br en 1
观察点命令
当变量被写入时设置一个观察点
(gdb) watch global_var
(lldb) watchpoint set variable global_var
(lldb) wa s v global_var
当写入内存位置时设置一个观察点
如果未指定“-x byte_size”,则待监视区域的大小默认为指针大小。此命令接受原始输入,并将其计算为一个表达式,该表达式返回一个指向区域起始位置的无符号整数,位于“-”选项终止符之后。
(gdb) watch -location g_char_ptr
(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.out modify + 21 at main.cpp:16, stop reason = watchpoint 1
frame #0: 0x0000000100000ef5 a.out modify + 21 at main.cpp:16
frame #1: 0x0000000100000eac a.out main + 108 at main.cpp:25
frame #2: 0x00007fff8ac9c7e1 libdyld.dylib`start + 1
(lldb) frame var global
(int32_t) global = 5
列出所有监视点
(gdb) info break
(lldb) watchpoint list
(lldb) watch l
删除监视点
(gdb) delete 1
(lldb) watchpoint delete 1
(lldb) watch del 1
检查变量
显示当前帧的参数和局部变量
(gdb) info args
(gdb) info locals
(lldb) frame variable
(lldb) fr v
显示当前帧的局部变量
(gdb) info locals
(lldb) frame variable --no-args
(lldb) fr v -a
显示局部变量的内容bar
(gdb) p bar
(lldb) frame variable bar
(lldb) fr v bar
(lldb) p bar
bar显示以十六进制格式显示的局部变量的内容
(gdb) p/x bar
(lldb) frame variable --format x bar
(lldb) fr v -f x bar
显示全局变量的内容baz#
(gdb) p baz
(lldb) target variable baz
(lldb) ta v baz
显示当前源文件中定义的全局/静态变量
(lldb) target variable
(lldb) ta v
argc每次argv停止时显示变量
(gdb) display argc
(gdb) display 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
显示变量argc,并且仅当您在名为#argv的函数中停止时main
(lldb) target stop-hook add --name main --one-liner "frame variable argc argv"
(lldb) ta st a -n main -o "fr v argc argv"
仅当您在名为#*this的 c 类中停止时才显示变量MyClass
(lldb) target stop-hook add --classname MyClass --one-liner "frame variable *this"
(lldb) ta st a -c MyClass -o "fr v *this"
打印内存中的整数数组,假设我们有一个指针,如#int *ptr
(gdb) p *ptr@10
(lldb) parray 10 ptr
表达式求值
在当前框架中评估广义表达式
(gdb) print (int) printf ("Print nine: %d.", 4 + 5)
或者如果你不想看到无效的回报:
(gdb) call (int) printf ("Print nine: %d.", 4 + 5)
(lldb) expr (int) printf ("Print nine: %d.", 4 + 5)
或使用打印别名:
(lldb) print (int) printf ("Print nine: %d.", 4 + 5)
创建并分配一个便捷变量
(gdb) set $foo = 5
(gdb) set variable $foo = 5
或使用打印命令
(gdb) print $foo = 5
或使用 call 命令
(gdb) call $foo = 5
如果您想指定变量的类型:
(gdb) set $foo = (unsigned int) 5
在 lldb 中,您可以像在 C 中编写一样评估变量声明表达式:
(lldb) expr unsigned int $foo = 5
打印对象的 ObjC“描述”
(gdb) po [SomeClass returnAnObject]
(lldb) expr -o -- [SomeClass returnAnObject]
或者使用 po 别名:
(lldb) po [SomeClass returnAnObject]
打印表达式结果的动态类型
(gdb) set print object 1
(gdb) p someCPPObjectPtrOrReference
(Only works for C++ objects)
如果确定动态类型不需要运行目标(在 C++ 中,永远不需要运行目标),LLDB 会自动执行此操作。此默认值由设置控制target.prefer-dynamic-value。如果禁用该设置,可以针对每个命令重新启用:
(lldb) settings set target.prefer-dynamic-value no-dynamic-values
(lldb) frame variable -d no-run-target someCPPObjectPtrOrReference
(lldb) expr -d no-run-target -- someCPPObjectPtr
请注意,该命令无法打印动态类型的引用 expr。解决方法是获取引用的地址,并指示 lldb 打印结果指针的子指针。
(lldb) expr -P1 -d no-run-target -- &someCPPObjectReference
调用一个函数,这样你就可以在断点处停止
(gdb) set unwindonsignal 0
(gdb) p function_with_a_breakpoint()
(lldb) expr -i 0 -- function_with_a_breakpoint()
调用一个崩溃的函数,然后在崩溃时停止
(gdb) set unwindonsignal 0
(gdb) p function_which_crashes()
(lldb) expr -u 0 -- function_which_crashes()
检查线程状态
列出程序中的线程
(gdb) info threads
(lldb) thread list
选择线程1作为后续命令的默认线程
(gdb) thread 1
(lldb) thread select 1
(lldb) t 1
显示当前线程的堆栈回溯
(gdb) bt
(lldb) thread backtrace
(lldb) bt
显示所有线程的堆栈回溯
(gdb) thread apply all bt
(lldb) thread backtrace all
(lldb) bt all
回溯当前线程的前五帧
(gdb) bt 5
(lldb) thread backtrace -c 5
(lldb) bt 5
根据索引为当前线程选择不同的堆栈帧
(gdb) frame 12
(lldb) frame select 12
(lldb) fr s 12
(lldb) f 12
列出当前线程中当前选定框架的信息
(lldb) frame info
选择调用当前堆栈帧的堆栈帧
(gdb) up
(lldb) up
(lldb) frame select --relative=1
选择当前堆栈帧调用的堆栈帧
(gdb) down
(lldb) down
(lldb) frame select --relative=-1
(lldb) fr s -r-1
使用相对偏移量选择不同的堆栈帧
(gdb) up 2
(gdb) down 3
(lldb) frame select --relative 2
(lldb) fr s
(lldb) frame select –relative -3
(lldb) fr s -r-3
显示当前线程的通用寄存器
(gdb) info registers
(lldb) register read
将新的十进制值写入123当前线程寄存器rax
(gdb) p $rax = 123
(lldb) register write rax 123
跳过当前程序计数器(指令指针)前面的 8 个字节
请注意,我们使用反引号来评估表达式并将标量结果插入 LLDB。
(gdb) jump $pc+8
(lldb) register write pc $pc+8
显示当前线程的通用寄存器,格式为有符号十进制
LLDB 会尽可能使用与 printf(3) 相同的格式字符。输入“help format”即可查看完整的格式说明符列表。
(lldb) register read --format i
(lldb) re r -f i
LLDB 现在支持 GDB 简写格式语法,但命令后不能有空格:
(lldb) register read/d
显示当前线程的所有寄存器集中的所有寄存器
(gdb) info all-registers
(lldb) register read --all
(lldb) re r -a
显示当前线程中名为rax、rsp和rbp 的寄存器的值
(gdb) info all-registers rax rsp rbp
(lldb) register read rax rsp rbp
rax以二进制格式显示当前线程中命名的寄存器的值
(gdb) p/t $rax
(lldb) register read --format binary rax
(lldb) re r -f b rax
LLDB 现在支持 GDB 简写格式语法,但命令后不能有空格
(lldb) register read/t rax
(lldb) p/t $rax
从地址读取内存0xbffff3c0并显示 4 个十六进制uint32_t值
(gdb) x/4xw 0xbffff3c0
(lldb) memory read --size 4 --format x --count 4 0xbffff3c0
(lldb) me r -s4 -fx -c4 0xbffff3c0
(lldb) x -s4 -fx -c4 0xbffff3c0
LLDB 现在支持 GDB 简写格式语法,但命令后不能有空格:
(lldb) memory read/4xw 0xbffff3c0
(lldb) x/4xw 0xbffff3c0
(lldb) memory read --gdb-format 4xw 0xbffff3c0
从表达式argv[0]#开始读取内存
(
gdb) x argv[0]
(lldb) memory read argv[0]
注意:任何命令都可以使用任何表达式周围的反引号内联标量表达式结果(只要目标停止):
(lldb) memory read --size sizeof(int) argv[0]
从地址读取512内存字节0xbffff3c0并将结果以文本形式保存到本地文件
(gdb) set logging on
(gdb) set logging file /tmp/mem.txt
(gdb) x/512bx 0xbffff3c0
(gdb) set logging off
(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到文件中
(gdb) dump memory /tmp/mem.bin 0x1000 0x2000
(lldb) memory read --outfile /tmp/mem.bin --binary 0x1000 0x2000
(lldb) me r -o /tmp/mem.bin -b 0x1000 0x2000
打印有关内存区域的信息
(gdb) info proc mappings
(lldb) memory region --all
(lldb) me reg --all
获取有关特定堆分配的信息(仅限 macOS )
(gdb) info malloc 0x10010d680
(lldb) command script import lldb.macosx.heap
(lldb) process launch --environment MallocStackLogging=1 -- [ARGS]
(lldb) malloc_info --stack-history 0x10010d680
获取有关特定堆分配的信息,并将结果转换为可以推断的任何动态类型(仅限 macOS)
(lldb) command script import lldb.macosx.heap
(lldb) malloc_info --type 0x10010d680
查找所有包含表达式指定的指针的堆块EXPR(仅限 macOS )
(lldb) command script import lldb.macosx.heap
(lldb) ptr_refs EXPR
查找块中任意位置包含 C 字符串的所有堆块(仅限 macOS )
(lldb) command script import lldb.macosx.heap
(lldb) cstr_refs CSTRING
反汇编当前帧的当前函数
(gdb) disassemble
(lldb) disassemble --frame
(lldb) di -f
反汇编任何名为main的函数
(gdb) disassemble main
(lldb) disassemble --name main
(lldb) di -n main
反汇编地址范围
(gdb) disassemble 0x1eb8 0x1ec3
(lldb) disassemble --start-address 0x1eb8 --end-address 0x1ec3
(lldb) di -s 0x1eb8 -e 0x1ec3
20从给定地址反汇编指令
(gdb) x/20i 0x1eb8
(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
可执行文件和共享库查询命令
列出主可执行文件和所有依赖的共享库
(gdb) info shared
(lldb) image list
查找可执行文件或任何共享库中的原始地址信息
(gdb) info symbol 0x1ec4
(lldb) image lookup --address 0x1ec4
(lldb) im loo -a 0x1ec4
在二进制文件中查找与正则表达式匹配的函数
(gdb) info function <FUNC_REGEX>
这个找到调试符号:
(lldb) image lookup -r -n <FUNC_REGEX>
这个找到非调试符号:
(lldb) image lookup -r -s <FUNC_REGEX>
提供二进制列表作为参数来限制搜索。
查找完整的源代码行信息
(gdb) info line 0x1ec4
目前这个有点混乱。请执行以下操作:
(lldb) image lookup -v --address 0x1ec4
并查找 LineEntry 行,其中将包含完整的源路径和行范围信息。
a.out仅查找#中的地址信息
(lldb) image lookup --address 0x1ec4 a.out
(lldb) im loo -a 0x1ec4 a.out
Point按名称查找类型的信息
(gdb) ptype Point
(lldb) image lookup --type Point
(lldb) im loo -t Point
转储主可执行文件和任何共享库中的所有部分#
(gdb) maintenance info sections
(lldb) image dump sections
a.out转储模块中的所有部分
(lldb) image dump sections a.out
转储主可执行文件和任何共享库中的所有符号
(lldb) image dump symtab
转储所有符号a.out和liba.so
(lldb) image dump symtab a.out liba.so
将当前进程保存为核心文件
(gdb) gcore filename
(lldb) process save-core filename
各种各样的
搜索关键字的命令帮助
(gdb) apropos keyword
(lldb) apropos keyword
将文本回显到屏幕
(gdb) echo Here is some text\n
(lldb) script print "Here is some text"
重新映射调试会话的源文件路径名
如果您的源文件不再位于与程序构建时相同的位置(例如,如果程序是在不同的计算机上构建的),您需要告诉调试器如何在本地文件路径而不是构建系统的文件路径中找到源。
(gdb) set pathname-substitutions /buildbot/path /my/path
(lldb) settings set target.source-map /buildbot/path /my/path
提供一个用于搜索源文件的综合目录。
(gdb) directory /my/path
