深入了解codelldb

发布时间:2023-05-19

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调试代码时,一些技巧可以帮助我们更快速和高效地定位问题:

  1. 断点:通过设置断点来停止程序的执行,以便我们检查程序在某个特定点的状态。在codelldb中,我们可以使用breakpoint set命令来设置断点。例如,在文件中第5行设置断点:
    breakpoint set --file main.c --line 5
    
  2. 查看变量:使用expression命令可以查看表达式的值。例如,在程序断点的位置查看变量“x”的值:
    expression x
    
  3. 查看堆栈:使用thread命令可以切换线程,使用backtrace命令可以查看当前堆栈。例如,在程序断点的位置查看当前堆栈信息:
    thread list
    thread N
    backtrace
    
  4. 内存查看:使用memory命令可以查看某个内存地址的值。例如,在程序断点的位置查看某个内存地址的值:
    memory read --format x --count 1 0x1000
    
  5. 打印日志:通过在代码中添加打印语句来调试程序。在codelldb中,我们可以通过log enable命令来控制显示的日志级别。例如,启用具有“debug”标签的调试信息:
    log enable --category debug
    

三、codelldb进阶

codelldb使用Python脚本增强了其功能。以下是一些常用的Python脚本:

  1. 结构体显示:在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
    
  2. 断点命令:在程序停止后执行的命令。以下是一个在程序断点的位置自动查看堆栈的脚本:
    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功能强大,扩展性良好,可以满足我们调试的各种需求。