codelldb是一个基于LLVM/Clang库,可以在命令行或者Xcode中使用的交互式调试器。它支持C、C++、ObjC、Swift等多种语言。
一、安装和配置
在MacOS上安装codelldb非常简单,只需要在终端中使用Homebrew工具执行以下命令:
brew install codelldb
安装完毕后,我们通过在终端中输入codelldb
来启动调试器。
在使用之前,我们需要对codelldb进行一些基本的配置。以下是一些我们常用的配置选项:
settings set target.x86-disassembly-flavor intel
:设置以Intel汇编风格显示源代码settings set target.exec-search-paths
:设置可执行文件的搜索路径command script import
:导入Python脚本,增加codelldb的功能 我们可以通过执行以下命令打开.codelldbinit
文件来进行配置:
vim ~/.codelldbinit
在该文件中写入上述的配置命令即可生效。
二、调试技巧
在使用codelldb调试代码时,一些技巧可以帮助我们更快速和高效地定位问题:
- 断点:通过设置断点来停止程序的执行,以便我们检查程序在某个特定点的状态。在codelldb中,我们可以使用
breakpoint set
命令来设置断点。例如,在文件中第5行设置断点:breakpoint set --file main.c --line 5
- 查看变量:使用
expression
命令可以查看表达式的值。例如,在程序断点的位置查看变量“x”的值:expression x
- 查看堆栈:使用
thread
命令可以切换线程,使用backtrace
命令可以查看当前堆栈。例如,在程序断点的位置查看当前堆栈信息:thread list thread N backtrace
- 内存查看:使用
memory
命令可以查看某个内存地址的值。例如,在程序断点的位置查看某个内存地址的值:memory read --format x --count 1 0x1000
- 打印日志:通过在代码中添加打印语句来调试程序。在codelldb中,我们可以通过
log enable
命令来控制显示的日志级别。例如,启用具有“debug”标签的调试信息:log enable --category debug
三、codelldb进阶
codelldb使用Python脚本增强了其功能。以下是一些常用的Python脚本:
- 结构体显示:在codelldb中,结构体默认以Hex方式显示。使用Python脚本可以自定义结构体的显示方式。以下是一个简单的脚本来显示结构体的成员:
输出结果形如:import lldb def __lldb_init_module(debugger,dict): debugger.HandleCommand('type category define -C format -F my_format MyStruct"') def my_format(valobj,internal_dict): return valobj.GetFrame().EvaluateExpression('"{0}",{1},{2}'.format(valobj.GetName()+'_member1', valobj.GetChildMemberWithName('member1'), valobj.GetChildMemberWithName('member2')))
(lldb) p my_struct (MyStruct) $0 = "my_struct_member1", 2, 3
- 断点命令:在程序停止后执行的命令。以下是一个在程序断点的位置自动查看堆栈的脚本:
命令使用方式:def breakpoint_command(debugger, command, result, internal_dict): if command == "bt": debugger.HandleCommand("bt") return True
(lldb) breakpoint command add --python-function breakpoint_command
四、结语
以上是对codelldb的简单介绍和使用技巧。codelldb功能强大,扩展性良好,可以满足我们调试的各种需求。