LLDB 常用命令补充
LLDB 常用命令补充
在上篇中,简单介绍了lldb命令的基本使用和调试流程。在每个调试流程中有一系列的命令,在这篇中主要介绍常用的命令。
当然,对于lldb而言,其有十分详尽的help查阅功能。
管理breakpoint
breakpoint是调试程序首要的手段。它提供了能够暂停程序执行来与程序交互的手段。
lldb提供了许多[subcommand]对于breakpoint的管理特性:
set用于设置断点enable和disable用于对断点的开启和禁用clear和delete用于清除断点list用于查看设置的断点的相关信息modify用于修改某个(多个)断点的相关信息command用于添加、删除或者修改某个(多个)断点在到达时需要执行的lldb相关命令read和write可以用文件中读入和写入断点- …
需要解释的一点是关于断点编号。当使用breakpoint list命令的时候,会看到类似下面的输出:
(lldb) breakpoint list
Current breakpoints:
1: name = 'sayHello', locations = 1
1.1: where = main`main.sayHello () -> () + 15 at main.swift:2, address =
main[0x00000001000011cf], unresolved, hit count = 0
2: file = 'main.swift', line = 4, exact_match = 0, locations = 1
2.1: where = main`main + 70 at main.swift:7, address = main[0x00000001000011a6],
unresolved, hit count = 0
在使用命令设置一个断点时候,创建的是逻辑断点(logical breakpoint)。一个逻辑断点会分配一个数字的序列号;一个逻辑断点可能对应不同的在源文件中的位置(比如,当用方法名来设置断点时,不同的文件中的该同名方法都会被打上断点,所以出现多处位置)。
所以上例中,1:和2:对应的是不同的逻辑断点,它们locations参数都是1,也就是只出现一处。
如果有新的源文件加入,又符合该逻辑断点的设置的条件。该逻辑断点会出现新的断点位置。
在命令设置断点时,找不到具体位置的断点被称为pending breakpoint。
编辑断点属性
使用breakpoint modify修改某一个断点或者是断点位置的属性。该命令的参数(argument)为断点ID或者是特点断点位ID。比较实用的属性修改有:
--one-shot设置断点为执行一次就被自动移除--condition满足该条件时,该断点才会断下程序运行--ignore-count在该断点第一次起作用断下程序的执行之前应该被忽略几次
例如:
(lldb) breakpoint modify --one-shot 1
将breakpoint ID为1的断点设置为一次执行就自动移除掉。
添加断点处执行的lldb指令
使用breakpoint command add命令添加断点到达时需要执行的lldb指令。该命令的参数与编辑断点属性参数一直,为breakpoint ID或者location ID。
例如:
(lldb) breakpoint command add 1.1
Enter your debugger command(s). Type 'DONE' to end.
> thread backtrace
> frame variable
> DONE
在location ID为1.1的断点位到达时,执行输出调用栈和当前栈帧的所有变量信息。该功能获取的信息实际上就是XCode的debug console上的一些输出信息。
控制程序执行流程
关于这个部分命令没有什么可以补充的。在上篇中,就已经做了比较详细的介绍。
在XCode的调试面板中,也就这几个指令相对应的控件按钮。
查看调用栈信息
关于调用栈,文档有一个粗略的解释:
While a program is running, it stores information about what it’s doing in a data structure known as a call stack. Each time a method is called, the program pushes a new stack frame on top of the call stack, which contains the following: the arguments passed to the method, if any, the local variables of the method, if any, and the address to return to after the method call finishes.
通过thread backtrace命令可以输出当前调用栈信息,也就是程序是如何到达当前栈帧的。
关于栈帧的调试命令frame的[subcommand]常用的大概有三个:
frame select选择需要查看的栈帧frame info输出该栈帧的信息frame variable输出栈帧上所有变量的信息
使用help frame [subcommand]查看更多关于调用栈调试的命令。