• lldb调试器知多少


    lldb调试器简介
     
    lldb 是一个有着 REPL 的特性和 C++ 、Python 插件的开源调试器。lldb调试器的由来是伴随着Xcode的版本升级而来。
    Xcode4.3之前使用的默认调试器是gdb, 到Xcode4.3之后便改成了lldb。gdb是UNIX及UNIX-like下的调试工具,是来自于GNU组织。
    后被苹果进行优化,功能添加后,改名为lldb。可以说lldb是gdb的高版本。
     
    lldb调试器是一个可执行Mach-O文件,因为通常是和xcode集成在一起,会让人误以为是xcode的一个功能,或者是xcode的一个插件。
    然后并非如此,它是一个可执行的应用,可以任意组合,比如:
    Mac系统就有自带调试器lldb:
    /Library/Developer/CommandLineTools/usr/bin/lldb
    

     Xcode中也自带来了调试器lldb:

    /Applications/Xcode.app/Contents/Developer/usr/bin/lldb
    
    lldb调试器使用
     
    在Xcode集成环境中,lldb使用方法简单;
    运行Xcode工程后暂停项目,在lldb调试器窗口就可以使用lldb命令进行调试了。
     
    如果没有Xcode集成环境怎么使用lldb呢?
    这就有许多步骤需要我们手动完成了。
     
    1.先通过ps查询当前运行的程序:
    192:~ zhoufei$ ps aux | grep /Applications
    
    zhoufei           1496   0.8  4.2  6501004 348924   ??  S    10:14下午   0:35.31 /Applications/YoudaoNote.app/Contents/MacOS/YoudaoNote
    zhoufei           1255   0.0  2.0  8894360 168828   ??  S    10:01下午   0:43.20 /Applications/Firefox.app/Contents/MacOS/firefox
    

    2.开启调试一个静止的app程序

    //通过lldb调试器打开静态程序
    192:bin zhoufei$ lldb firefox
    
    //或者
    
    //通过lldb调试器打开 带参数的 静态程序
    192:bin zhoufei$ lldb firefox 11 22
    

    3.将lldb调试器附加到一个正在运行的app程序

    //1.先打开lldb调试器
    192:bin zhoufei$ lldb
    
    //2.将调试器附加到要调试的目标可执行文件上
    (lldb) process attach --name firefox
    Process 1255 stopped
    * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
        frame #0: 0x00007fff7570920a libsystem_kernel.dylib`mach_msg_trap + 10
    libsystem_kernel.dylib`mach_msg_trap:
    ->  0x7fff7570920a <+10>: retq   
        0x7fff7570920b <+11>: nop    
    
    libsystem_kernel.dylib`mach_msg_overwrite_trap:
        0x7fff7570920c <+0>:  movq   %rcx, %r10
        0x7fff7570920f <+3>:  movl   $0x1000020, %eax          ; imm = 0x1000020 
    Target 0: (firefox) stopped.
    
    Executable module set to "/Applications/Firefox.app/Contents/MacOS/firefox".
    Architecture set to: x86_64h-apple-macosx.
    (lldb) thread list
    

     4.根据调试命令进行调试

    lldb调试器常用命令
     lldb的命令结构如下:
    Command  subCommand action -opt argument
    命令  子命令  动作  选项  参数。
    <command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
    

     1.打印命令

    //同expression
    p
    //打印对象
    po
    

    2.项目中mach-o文件查询

    //在app使用到的所有mach-o文件中查询
    image lookup 
    //查询 类型UITableViewCell 在mach-o中的定义信息,并打印出最佳匹配
    image lookup -t UITableViewCell 
    
    //查询 崩溃内存地址0x000000010e041b62 在mach-o中的定义信息,并打印出最佳匹配
    //4   WYDoctorConsultModule_Example       0x000000010e041b62 -[WYFastConsultViewController //emptyViewModelDidRefreshOrderList:] + 162
    image lookup -a 0x000000010e041b62
    
    //查询 方法名或者符号名为emptyViewModelDidRefreshOrderList: 在mach-o中的定义信息,并打印出最佳匹配
    image lookup -n emptyModelDidRefreshOrderList:
    
    //查询 app中所有使用的mach-o信息,并打印出最佳匹配
    image list
    
    3.项目中对某个内存数据进行监控,如:全局变量,静态变量
    watchpoint set variable
    //对变量self->_pageNo进行监控
    watchpoint set variable self->_pageNo
    
    //对内存地址&(self->_pageNo)进行监控
    watchpoint set expression &(self->_pageNo)
    
    //查询所有的内存监控
    watchpoint list
    
    //删除序号为:1 的内存监控
    watchpoint delete 1
    
    //额外命令追加
    //当序号:2 断点触发时,执行追加的命令
     watchpoint command add 2
    //删除序号:2的命令追加
    watchpoint command delete 2
    //查询所有追加命令的列表
    watchpoint command list
    

    4.为项目源码外的第三方静态库,动态库添加断点

    breakpoint set
    breakpoint set -a 函数地址
    breakpoint set -n 函数名称
    //为符合正则表达式函数全部添加断点
    breakpoint set -r 任意包含此字符串的函数名称
    
    //breakpoint set -s 动态库名称 -n 动态库方法名
    breakpoint set -s dyld -n load
    
    5.函数调用堆栈控制
    比Xcode视图展示的线程堆栈更加详细
    //打印当前栈帧frame的堆栈信息
    thread backtrace
    bt命令同上
    
    //函数提前返回
    thread return [返回值]
    
    //当前栈帧的所有局部变量
    frame variable
    
    //源码级 代码单步执行,下一步
    thread step-over, next, n
    //指令级 汇编单步执行,下一步
    thread step-inst-over, nexti, ni
    
    6.原始命令
    原始命令命令后面默认都是参数, 
    如果要跟选项的话,需要添加 — 声明结束,后面跟着参数。
    expression (就是 p/print/call)
    expression -o(就是 po)
    
    //打印对象内存地址
    expression -o -- 0x1111   
    
    7.辅助命令 apropos
    可以通过模糊搜索,查询带有关键字的命令
    如: apropos list    //查询出所有包含list命令的lldb命令。
     
     lldb调试器扩展
     
    chisel是facebook开源的插件
    安装方式简单:
    brew install chisel
     安装成功后,修改~/.lldbinit文件,在文件的末尾增加一行:
    command script import /usr/local/opt/chisel/libexec/fblldb.py
    

    后保存, 重启Xcode或者重新打开终端,让修改生效。

    最后

    平时的iOS开发中,使用的OC或者Swift是编译性语言,每次修改都有重新编译后才能看到结果,如果合理使用lldb调试器,将会大大提高开发效率。

     
     
     
     
     
     
  • 相关阅读:
    MVC3基础嵌套总结
    List之Union(),Intersect(),Except() 亦可以说是数学中的并集,交集,差集
    sqlserver查询记录数某个区间内记录
    各语言的unix时间戳 【转】
    SQLserver删除某数据库中所有表
    C#日期格式转换大全
    【转】Linq之动态排序(字符传入)
    谈谈Equals和GetHashcode
    JS常用代码收集
    ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE(N)
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/12199342.html
Copyright © 2020-2023  润新知