美文网首页
Xcode的LLDB调试命令

Xcode的LLDB调试命令

作者: 立志成为卓越逆向工程师的小仙女 | 来源:发表于2018-05-11 16:35 被阅读74次

    LLDB的使用指令

    屏幕快照 2018-05-11 下午4.49.17.png

    断点设置

    • 通过名字设置C的断点

    假设有个方法

    void age(){
        print("age")
    }
    

    通过命令在age上设置断点

     breakpoint set -n age
    

    其中 -n--name的缩写 ,set是子命令

    • 通过名字设置OC的断点

    假设ViewController中有两个OC的方法

    -(void)test1:(NSString *)string{
    
    }
    -(void)test2:(NSString *)string{
    
    }
    
    
    

    通过命令给这两个方法设置断点

    breakpoint set -n "[ViewController test1:]" -n "[ViewController test2:]"
    

    其中OC的方法要用""阔起来,多个断点间用空格隔开

    • 通过名字设置断点,不管方法在哪个类里

    breakpoint set --selector touchesBegan:withEvent:

    其中 --selector 代表方法 touchesBegan:withEvent:OC的方法名

    • 通过文件设置断点,比如:设置ViewController.m这个类里的touchesBegan:withEvent:

    breakpoint set --file ViewController.m --selector touchesBegan:withEvent:

    • 遍历方法名称设置断点
      breakpoint set -r Game: 其中Game:只是方法的一部分

    • 查看当前的断点信息

    指令 breakpoint list

    Current breakpoints:
    1: names = {'[ViewController test1]', '[ViewController exp1]', '[ViewController test2]', '[ViewController exp2]'}, locations = 0 (pending)
    2: names = {'[ViewController test1:]', '[ViewController exp1:]', '[ViewController test2:]', '[ViewController exp2:]'}, locations = 2, resolved = 2, hit count = 0
     2.1: where = textIphone`-[ViewController test1:] + 46 at ViewController.m:29, address = 0x00000001006465ee, resolved, hit count = 0 
     2.2: where = textIphone`-[ViewController test2:] + 46 at ViewController.m:33, address = 0x000000010064663e, resolved, hit count = 0
      
    

    2.1代表是第二组的第一个断点

    • 禁用某个断点breakpoint disable 1

    • 启用断点breakpoint enable 1.1

    • 删除断点 breakpoint delete 1 如果delete后不跟任何参数 默认为删除所有的断点

    • 假如进入断点以后想要继续进行下一步操作,可以直接在控制台输入c 继续操作

    • 查看其他指令系统 help

    • 查看断点的子指令 help breakpoint

    • 简写形式
      breakpoint -> break
      disable -> dis

    动态的执行指令

    expression 执行某段代码 expression -> p,

    help p -> 'p' is an abbreviation for 'expression --' ,

    po 是输出OC的对象,调用OC对象的描述方法 具体可以通过help expression查看

    比如我们进入断点后想查看当前视图的子视图

    (lldb) expression self.view.subviews

    输出: (__NSArray0 *) $0 = 0x000060c0000064a0 @"0 elements"

    其中$0 这个可以理解成控制台当前的全局参数 在后面可以继续使用

    • $0这个参数虽然在后面可以用,但是它是一个id类型,如果直接访问它原来的方法或者属性会报错,因此你可以在 p指令的时候进行一个类型强转
    • 使用p执行一段代码 代码换行使用 control + enter
    • 在控制台上下按键可以执行上一条或者下一条

    给某个断点设置默认的指令

    command指令

    • 添加代码 breakpoint command add 1 回车 给断点1添加代码
    
    Enter your debugger command(s).  Type 'DONE' to end.
    > 输入你的代码 
    > 输入'DONE'结束
    
    

    过掉断点运行,进入到断点1时就会直接执行输入你的代码这部分代码了

    • 查看添加过的指令

    breakpoint command list 1 查看断点1的指令

    • 删除指令

    breakpoint command delete 1删除断点1下的指令

    stop-hook

    每次stop的时候去执行某些方法 watchPoint(内存断点)
    pause 和 debugView 不会触发stop-hook

    • 设置stop-hook

      target stop-hook add -o "frame variable" 进入断点查看当前的参数

    • 查看当前的stop-hook 删除全部list后面不跟数字

      target stop-hook list 2

    • 删除当前的stop-hook ,删除标号为1的stop-hook,如果删除全部后面不带内容

      target stop-hook delete 1

    • 禁用某一个stop-hook 屏蔽掉标号为6的stop-hook

      undisplay 6

    • 启用某个stop-hook

      display 6

    • 设置永久stop-hook
      你只需要在 /Users/你的用户 下建一个.lldbinit文件 ,每次启动lldb的时候就会加载这个文件的内容
      .lldbinit文件中 写target stop-hook add -o "frame variable" ,每次进入断点就会打印参数信息

    其他的命令

    • 查看内存
      image lookup -a 0x0000000112e02796 ,

      0x0000000112e02796是崩溃信息中的一个堆区地址

    • 进入image后 可以通过down 查看下一个堆区地址 up看上一个堆区地址

    • 查看某个类的定义

      image lookup -t Person

      image list

    • 查看内存

      memory read 0x600000226520 == x 0x600000226520

      读寄存器 register read 地址

    相关文章

      网友评论

          本文标题:Xcode的LLDB调试命令

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