美文网首页
LLDB的学习流水账(一)

LLDB的学习流水账(一)

作者: coldLeon | 来源:发表于2017-11-26 17:00 被阅读0次

    LLDB的语法:

    <command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]

    1. <command>(命令)和<subcommand>(子命令):LLDB调试命令的名称。命令和子命令按层级结构来排列:一个命令对象为跟随其的子命令对象创建一个上下文,子命令又为其子命令创建一个上下文,依此类推。
    2. <action>:执行命令的操作
    3. <options>:命令选项
    4. <arguement>:命令的参数
    5. []:表示命令是可选的,可以有也可以没有

    如何使用命令选项?

    命令选项可以选择全称拼写,也可以缩写,示例:

    breakpoint set
    
       -M <method> ( --method <method> )
    
       -S <selector> ( --selector <selector> )
    
       -b <function-name> ( --basename <function-name> )
    
       -f <filename> ( --file <filename> )
    
       -l <linenum> ( --line <linenum> )
    
       -n <function-name> ( --name <function-name> )
    

    使用LLDB帮助

    help指令: help\help -a

    LLDB作为单独调试器的使用方法

    需要掌握的方法:
    1、加载需要调试的进程
    2、把一个正在运行的进程加入到LLDB中
    3、设置断点和观察点
    4、控制进程的执行
    5、控制被调试进程的运行
    6、观测变量的状态和值
    7、执行你想执行的逻辑分支

    加载需要调试的进程:

    $ lldb /Projects/Sketch/build/Debug/Sketch.app

    设置断点

    (lldb) breakpoint set --selector alignLeftEdges:
    breakpoint list可用于查看当前加入的断点

    设置观察点(可使用help watchpoint来查看该命令的帮助)

    Watchpoint created: Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
       declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
    (lldb) watch modify -c '(global==5)'
    (lldb) watch list
    Current watchpoints:
    Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
        declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
        condition = '(global==5)'
    (lldb) c
    Process 15562 resuming
    (lldb) about to write to 'global'...
    Process 15562 stopped and was programmatically restarted.
    Process 15562 stopped and was programmatically restarted.
    Process 15562 stopped and was programmatically restarted.
    Process 15562 stopped and was programmatically restarted.
    Process 15562 stopped
    * 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
       13
       14      static void modify(int32_t &var) {
       15          ++var;
    -> 16      }
       17
       18      int main(int argc, char** argv) {
       19          int local = 0;
    (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
    (lldb) watch list -v
    Current watchpoints:
    Watchpoint 1: addr = 0x100001018 size = 4 state = enabled type = w
        declare @ '/Volumes/data/lldb/svn/ToT/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp:12'
        condition = '(global==5)'
        hw_index = 0  hit_count = 5     ignore_count = 0
    (lldb)
    

    载入程序到LLDB中

    对于未运行的程序,使用如下命令

    (lldb) process launch
    (lldb) run
    (lldb) r
    

    对于已经在运行的程序,使用如下命令把进程附到LLDB

    (lldb) process attach --pid 123
    (lldb) process attach --name Sketch
    (lldb) process attach --name Sketch --waitfor
    

    控制程序的运行

    (lldb) thread continue
    Resuming thread 0x2c03 in process 46915
    Resuming process 46915
    (lldb)
    (lldb) thread step-in // The same as "step" or "s" in GDB.
    (lldb) thread step-over // The same as "next" or "n" in GDB.
    (lldb) thread step-out // The same as "finish" or "f" in GDB.
    (lldb) thread step-inst // The same as "stepi" / "si" in GDB.
    (lldb) thread step-over-inst // The same as "nexti" / "ni" in GDB.
    (lldb) thread until 100
    (lldb) process continue
    (lldb) breakpoint set --name stop_here
    

    检查进程状态

    (lldb) thread list
    Process 46915 state is Stopped
    * thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
      thread #2: tid = 0x2e03, 0x00007fff85cbb08a, where = libSystem.B.dylib`kevent + 10, queue = com.apple.libdispatch-manager
      thread #3: tid = 0x2f03, 0x00007fff85cbbeaa, where = libSystem.B.dylib`__workq_kernreturn + 10
    (lldb) thread backtrace
    thread #1: tid = 0x2c03, stop reason = breakpoint 1.1, queue = com.apple.main-thread
     frame #0: 0x0000000100010d5b, where = Sketch`-[SKTGraphicView alignLeftEdges:] + 33 at /Projects/Sketch/SKTGraphicView.m:1405
     frame #1: 0x00007fff8602d152, where = AppKit`-[NSApplication sendAction:to:from:] + 95
     frame #2: 0x00007fff860516be, where = AppKit`-[NSMenuItem _corePerformAction] + 365
     frame #3: 0x00007fff86051428, where = AppKit`-[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 121
     frame #4: 0x00007fff860370c1, where = AppKit`-[NSMenu performKeyEquivalent:] + 272
     frame #5: 0x00007fff86035e69, where = AppKit`-[NSApplication _handleKeyEquivalent:] + 559
     frame #6: 0x00007fff85f06aa1, where = AppKit`-[NSApplication sendEvent:] + 3630
     frame #7: 0x00007fff85e9d922, where = AppKit`-[NSApplication run] + 474
     frame #8: 0x00007fff85e965f8, where = AppKit`NSApplicationMain + 364
     frame #9: 0x0000000100015ae3, where = Sketch`main + 33 at /Projects/Sketch/SKTMain.m:11
     frame #10: 0x0000000100000f20, where = Sketch`start + 52
    (lldb) thread backtrace all
    (lldb) thread select 2
    

    检查堆栈的状态

    (lldb) frame variable
    (lldb) frame variable self
    (lldb) frame variable self.isa
    

    执行自己想要执行的代码

    (lldb) expr (int) printf ("I have a pointer 0x%llx.\n", self)
    

    相关文章

      网友评论

          本文标题:LLDB的学习流水账(一)

          本文链接:https://www.haomeiwen.com/subject/raokbxtx.html