美文网首页
debugserver+lldb使用

debugserver+lldb使用

作者: yahibo | 来源:发表于2020-03-16 21:35 被阅读0次

    一、概述

    debugserver、lldb是协同工作的,debugserver依附在APP上,时刻监听APP的运行状态,并有控制APP执行的能力;lldb是在APP外部的,可以和debugserver建立连接,通过debugserver获取APP运行状态,并且能通知debugserverAPP做一些事情。在真机调试的时候,Xcodedebugserver加入到APP中,通过lldb来调试APP,那么同样也可以在iterm上对越狱手机上的任意APP进行调试。

    Mac(Xcode(lldb)) -> APP(debugserver)

    二、debugserver位置

    Xcodedebugserver的位置:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/13.2 如下图:

    position.jpg

    双击dmg查看debugserver位置:/usr/bin/debugserver如下图:

    debugserver.jpg

    知道debugserver的位置后,可以使用该工具scp到越狱手机上,附加到任意应用。

    三、越狱手机调试环境配置

    1、处理debugserver工具

    • /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/该路径下获取手机对应版本的debugserver工具
    • 或从越狱手机的/Developer/usr/bin路径下拉取debugserverMac上:scp -r -P2222 root@localhost:/Developer/use/bin/debugserver /Users/hibo/Desktop/

    通过Xcode或直接创建一个en.plist文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>com.apple.springboard.debugapplications</key>
        <true/>
        <key>run-unsigned-code</key>
        <true/>
        <key>get-task-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
    </dict>
    </plist>
    

    保存后对获取到的debugserver进行重签名,赋予新权限:

    codesign -s - --entitlements en.plist -f debugserver
    

    将重签后的debugserver传入到越狱手机的/usr/bin/路径下:

    scp -r -P2222 /Users/hibo/Desktop/debugserver root@localhost:/usr/bin/
    

    2、越狱手机启动debugserver服务

    debugserver ip:port –a app ip对应的手机ip直接使用*,port为对外开放的端口号(可以自定义)app为要附加的应用名称。

    查看进程:

    ps -A
    

    debugserver附加到微信进程上:

    debugserver localhost:12345 –a WeChat
    

    debugserver *:12345 –a WeChat
    

    注意:使用*:12345会导致连接失败:error: failed to get reply to handshake packet,请使用第一种连接方式即可。

    3、使用Mac终端启动lldb和越狱手机上的debugserver建立连接

    通过USB连接手机,使用iproxy映射端口:

    iproxy 12345 12345
    
    • 第一个12345为本机使用端口号
    • 第二个12345为手机对外开启的端口号

    在终端运行lldb,连接debugserver

    process connect connect://localhost:12345
    

    这样就连接上了,可使用lldb来调试越狱手机上的应用。

    四、lldb常用命令

    breakpoint使用

    1、给函数下断点

    breakpoint set --name test1 
    br s -n test1 
    b test1
    

    打印:

    Breakpoint 2: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97
    

    断点位置信息,执行便能在该处断住。

    连续下多个断点:

    breakpoint set -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continues:]"
    br s -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continues:]"
    

    运行c继续运行,n单步执行,s进入函数内部执行,finish执行到函数尾部。

    使用lldb命令进入断点模式,相当于Xcode上的pause program execution

    br s -r . -s XXX
    

    2、给指定方法下断点

    breakpoint set --method game
    br s -m game
    

    3、指定选择器下断点

    breakpoint set --selector touchesBegan:withEvent:
    br s -S touchesBegan:withEvent:
    

    4、指定文件、选择器下断点

    breakpoint set --file ViewController.m --selector touchesBegan:withEvent:
    br s -f ViewController.m --selector touchesBegan:withEvent:
    

    5、指定行设置断点

    breakpoint set --file ViewController.m --line 22
    br s -f ViewController.m -l 22
    

    6、设置别名

    breakpoint set --file game.m --line 55
    br s -f game.m -l 55
    
    command alias bfl br s -f %1 -l %2
    bfl game.m 55
    

    7、取消别名

    command unalias bfl
    command alias bfl breakpoint
    

    8、查看断点列表

    breakpoint list
    br list
    

    打印:

    1: file = '/Users/hibo/Documents/test/LLDB/LLDB/ViewController.m', line = 21, exact_match = 0, locations = 1 Options: disabled 
    
     1.1: where = LLDB`-[ViewController touchesBegan:withEvent:] + 70 at ViewController.m:22:6, address = 0x0000000109de9f46, unresolved, hit count = 2 Options: disabled 
    
    2: name = 'test1', locations = 1, resolved = 1, hit count = 7
    
     2.1: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97, resolved, hit count = 7 
    

    9、禁用断点

    breakpoint disable  //禁用所有断点
    breakpoint disable 1.1 //禁用第一个断点
    br disable
    br disable 1.1
    

    10、启用断点

    breakpoint enable   //启用所有断点
    breakpoint enable 1.1  //启用1处断点  
    br enable
    br enable 1.1
    

    11、删除所有断点

    breakpoint delete
    breakpoint delete 1
    br delete
    br delete 1
    

    删除只能删除一组,不能单个删除

    12、设置带有相同字符串的方法断点

    breakpoint set -r Game:
    br s -r Game:
    

    打印:

    Current breakpoints:
    
    1: regex = 'Game:', locations = 3, resolved = 3, hit count = 0
    
     1.1: where = LLDB`-[ViewController pauseGame:] + 43 at ViewController.m:31:5, address = 0x00000001010dff0b, resolved, hit count = 0 
    
     1.2: where = LLDB`-[ViewController continueGame:] + 43 at ViewController.m:34:5, address = 0x00000001010dff5b, resolved, hit count = 0 
    
     1.3: where = LinkPresentation`-[LPGameCenterInvitationMetadata setGame:], address = 0x00007fff2733e5e9, resolved, hit count = 0 
    

    如上也给其他带有Game字符的类下了断点。

    给某一个文件下的带有相同字符串的方法下断点:

    br s -f ViewController.m -r Game
    

    13、使应用进入断点

    process interrupt 
    

    br s -r . -s Shortcuts
    

    14、继续

    process  continue
    continue
    c
    

    15、下一步

    thread step-over
    Next
    n
    

    16、进入

    thread step-in
    step
    s
    

    17、跳出

    thread step-out
    finish
    f
    

    简写:breakpoint->br
    打印列表:breakpoint list或者br list

    bt、frame命令

    1、查看函数相关信息,使用p、down追踪函数的调用和被调用关系

    frame select
    

    使用bt命令查看函数调用堆栈

    2、查找方法的调用者及方法名称

    frame variable
    

    methods、pviews

    1、methods打印当前对象的属性和方法

    methods self 
    

    2、pviews打印当前视图的层级结构

    以上两个命令是lldb插件名中的命令。chisel安装

    ……

    相关文章

      网友评论

          本文标题:debugserver+lldb使用

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