lldb调试命令一

1.什么是LLDB

         LLDB是英文Low Lever Debug的缩写,是XCode内置的为我们开发者提供的调试工具;方便开发者对开发问题进行快速有效的解决;

2.LLDB 断点设置

新建一个Object-C工程,写了下方代码,给一个 OC 方法下断点,运行工程,就可以进入LLDB调试环境


1、使用LLDB中“breakpoint set -n 函数名 ”下断点


1.在lldb 中输入给demo1方法下断点

 breakpoint set -n demo1  
 
输出:
​​​​Breakpoint 2: where = LLDB调试`-[ViewController demo1] at ViewController.m:27, address = 0x000000010d8e1be0

表示断点下入成功

其中:

Breakpoint 2: 表示这是全局的第二个断点
where = LLDB调试`-[ViewController demo1] at ViewController.m:27,:标示断点位置和方法名称
address = 0x000000010d8e1be0:断点所表示的内存地址


2.给函数下断点
breakpoint set -n "[ViewController douYinClick:]"
Breakpoint 3: where = LLDB调试`-[ViewController douYinClick:] at ViewController.m:34, address = 0x000000010d8e1c10

2、breakpoint set -l 行数 -f 文件名


输入:
breakpoint set -l 23 -f ViewController.m
输出:
Breakpoint 4: where = LLDB调试`-[ViewController touchesBegan:withEvent:] + 77 at ViewController.m:23:5, address = 0x000000010d8e1b8d

3.使用breakpoint set -a 16位的物理地址

这里我们首先找到16为物理地址,xcode工具栏Debug  ->Debug WorkFlow -> Alawys Show Disassembly进入栈调试找到物理地址0x10d8e1b97;

输入:
breakpoint set -a 0x10d8e1b97
输出:
Breakpoint 5: where = LLDB调试`-[ViewController touchesBegan:withEvent:] + 87 at ViewController.m:24:6, address = 0x000000010d8e1b97

4、使用函数全部名称设置断点

breakpoint set -F 函数全名

输入:
breakpoint set -F kuaiShouClick:

5.使用函数局部名称进行设置断点

输入:
 breakpoint set -r touchBegan
输出:
Breakpoint 9: 5 locations.

这个说明是第9组下了断点,共下了5处断点,但是我们项目只有一个处实现了,说明给底层函数中也可以使用这种方式下断点,我们可以使用 breakpoint list进行验证

输入:
breakpoint list
输出:
Current breakpoints:
1: file = '/Users/a1/Desktop/GitHub/iOSLearn/LLDB/LLDB调试/LLDB调试/ViewController.m', line = 21, exact_match = 0, locations = 1, resolved = 1, hit count = 5

  1.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] at ViewController.m:21, address = 0x000000010d8e1b40, resolved, hit count = 5 

2: name = 'demo1', locations = 1, resolved = 1, hit count = 4
  2.1: where = LLDB调试`-[ViewController demo1] at ViewController.m:27, address = 0x000000010d8e1be0, resolved, hit count = 4 

3: names = {'[ViewController douYinClick:]', '[ViewController douYinClick:]'}, locations = 1, resolved = 1, hit count = 0
  3.1: where = LLDB调试`-[ViewController douYinClick:] at ViewController.m:34, address = 0x000000010d8e1c10, resolved, hit count = 0 

4: file = 'ViewController.m', line = 23, exact_match = 0, locations = 1, resolved = 1, hit count = 3
  4.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] + 77 at ViewController.m:23:5, address = 0x000000010d8e1b8d, resolved, hit count = 3 

5: address = LLDB调试[0x0000000100001b97], locations = 1, resolved = 1, hit count = 3
  5.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] + 87 at ViewController.m:24:6, address = 0x000000010d8e1b97, resolved, hit count = 3 

6: name = 'kuaiShouClick', locations = 0 (pending)

7: name = 'kuaiShouClick', locations = 0 (pending)

8: name = 'kuaiShouClick:', locations = 1, resolved = 1, hit count = 0
  8.1: where = LLDB调试`-[ViewController kuaiShouClick:] at ViewController.m:37, address = 0x000000010d8e1c60, resolved, hit count = 0 

9: regex = 'touchBegan', locations = 5, resolved = 5, hit count = 0
  9.1: where = UIKitCore`-[_UIFocusFastScrollingRecognizer focusEnginePanGesture:touchBeganAtDigitizerLocation:], address = 0x00007fff47371559, resolved, hit count = 0 
  9.2: where = UIKitCore`-[UIKeyboardMenuView showAsHUDFromLocation:withInputView:touchBegan:], address = 0x00007fff4750b652, resolved, hit count = 0 
  9.3: where = UIKitCore`-[_UITextDocumentInterface _setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff47518923, resolved, hit count = 0 
  9.4: where = UIKitCore`-[_UIInputViewControllerOutput setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff475196ce, resolved, hit count = 0 
  9.5: where = MapKit`-[MKActionRowItemView _touchBegan], address = 0x00007fff2768f2d6, resolved, hit count = 0 

这里我们可以看到第九组共有5出断点,都是底层使用的方法,并且都包含touchBegan 字段方法名称

3.LLDB断点配置

    其实断点配置还有很多,这里只是简单的列举几个:

  • -i <count> (--ignore -count <count>)
输入:
breakpoint set -F wangZheClick: -i 3
  • -o <boolean>只断住一次
输入:
 breakpoint set -F wangZheClick: -o yes
  • -N 给断点添加别名

输入:
breakpoint set -F douYinClick: -N douyinBreakPoint
输出:
Current breakpoints:
1: file = '/Users/a1/Desktop/GitHub/iOSLearn/LLDB/LLDB调试/LLDB调试/ViewController.m', line = 21, exact_match = 0, locations = 1, resolved = 1, hit count = 2

  1.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] at ViewController.m:21, address = 0x0000000105105b40, resolved, hit count = 2 

3: name = 'douYinClick:', locations = 1, resolved = 1, hit count = 0
  Names:
    douyinBreakPoint

  3.1: where = LLDB调试`-[ViewController douYinClick:] at ViewController.m:34, address = 0x0000000105105c10, resolved, hit count = 0 
  • -N 给断点添加别名
输入:
breakpoint set -n demo1 -c "i==10"

4.断点的禁用与启用和删除

  • 查看断点列表:breakpoint list 
输入:
breakpoint list 
输出:
Current breakpoints:
1: file = '/Users/a1/Desktop/GitHub/iOSLearn/LLDB/LLDB调试/LLDB调试/ViewController.m', line = 21, exact_match = 0, locations = 1, resolved = 1, hit count = 6

  1.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] at ViewController.m:21, address = 0x00000001094e2b30, resolved, hit count = 6 

2: name = 'demo1', locations = 1, resolved = 1, hit count = 5
Condition: i==10

  2.1: where = LLDB调试`-[ViewController demo1] at ViewController.m:29, address = 0x00000001094e2be0, resolved, hit count = 5 
  • 禁用第二组断点
输入:
breakpoint disable 2
输出:
1 breakpoints disabled.
查看下断点列表,说明第二组断点还在里面,只是没有启用
Current breakpoints:
1: file = '/Users/a1/Desktop/GitHub/iOSLearn/LLDB/LLDB调试/LLDB调试/ViewController.m', line = 21, exact_match = 0, locations = 1, resolved = 1, hit count = 8

  1.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] at ViewController.m:21, address = 0x00000001094e2b30, resolved, hit count = 8 

2: name = 'demo1', locations = 1 Options: disabled 
Condition: i==10

  2.1: where = LLDB调试`-[ViewController demo1] at ViewController.m:29, address = 0x00000001094e2be0, unresolved, hit count = 5 
  • 启用第二组断点
输入:
breakpoint enable 2

注意:我在这里操作的时候都是以组为单位进行禁用断点和启用断点,因为一般情况下我们下断点一组都是只有一个断点;
如果是如下情况,我们使用:breakpoint set -r touchBegan,下断点后,共5处断点

breakpoint list
Current breakpoints:
1: file = '/Users/a1/Desktop/GitHub/iOSLearn/LLDB/LLDB调试/LLDB调试/ViewController.m', line = 21, exact_match = 0, locations = 1, resolved = 1, hit count = 8

  1.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] at ViewController.m:21, address = 0x00000001094e2b30, resolved, hit count = 8 

2: name = 'demo1', locations = 1, resolved = 1, hit count = 5
Condition: i==10

  2.1: where = LLDB调试`-[ViewController demo1] at ViewController.m:29, address = 0x00000001094e2be0, resolved, hit count = 5 

3: regex = 'touchBegan', locations = 5, resolved = 5, hit count = 0
  3.1: where = UIKitCore`-[_UIFocusFastScrollingRecognizer focusEnginePanGesture:touchBeganAtDigitizerLocation:], address = 0x00007fff47371559, resolved, hit count = 0 
  3.2: where = UIKitCore`-[UIKeyboardMenuView showAsHUDFromLocation:withInputView:touchBegan:], address = 0x00007fff4750b652, resolved, hit count = 0 
  3.3: where = UIKitCore`-[_UITextDocumentInterface _setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff47518923, resolved, hit count = 0 
  3.4: where = UIKitCore`-[_UIInputViewControllerOutput setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff475196ce, resolved, hit count = 0 
  3.5: where = MapKit`-[MKActionRowItemView _touchBegan], address = 0x00007fff2768f2d6, resolved, hit count = 0 

我们只想给其中某一个方法下,可以找到它的编号:例如给[UIKeyboardMenuView showAsHUDFromLocation:withInputView:touchBegan:]这个方法下断点;

禁用输入:
breakpoint disable 3.3
启用输入:
breakpoint enable 3.3
  • 删除断点

        1.删除所有断点

输入:
breakpoint delete
输出:
About to delete all breakpoints, do you want to do that?: [Y/n] 
询问是否删除 Y
All breakpoints removed. (2 breakpoints)

查看breakpoint list
输出:No breakpoints currently set.



        2.删除组断点

输入:
breakpoint delete 2
输出:
1 breakpoints deleted; 0 breakpoint locations disabled.

查看breakpoint list

Current breakpoints:
1: file = '/Users/a1/Desktop/GitHub/iOSLearn/LLDB/LLDB调试/LLDB调试/ViewController.m', line = 21, exact_match = 0, locations = 1, resolved = 1, hit count = 8

  1.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] at ViewController.m:21, address = 0x00000001094e2b30, resolved, hit count = 8 

3: regex = 'touchBegan', locations = 5, resolved = 5, hit count = 0
  3.1: where = UIKitCore`-[_UIFocusFastScrollingRecognizer focusEnginePanGesture:touchBeganAtDigitizerLocation:], address = 0x00007fff47371559, resolved, hit count = 0 
  3.2: where = UIKitCore`-[UIKeyboardMenuView showAsHUDFromLocation:withInputView:touchBegan:], address = 0x00007fff4750b652, resolved, hit count = 0 
  3.3: where = UIKitCore`-[_UITextDocumentInterface _setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff47518923, resolved, hit count = 0 
  3.4: where = UIKitCore`-[_UIInputViewControllerOutput setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff475196ce, resolved, hit count = 0 
  3.5: where = MapKit`-[MKActionRowItemView _touchBegan], address = 0x00007fff2768f2d6, resolved, hit count = 0 

       2.删除组内断点

输入:
breakpoint delete 3.4
输出:
0 breakpoints deleted; 1 breakpoint locations disabled.

查看Breakpoint list 
Current breakpoints:
1: file = '/Users/a1/Desktop/GitHub/iOSLearn/LLDB/LLDB调试/LLDB调试/ViewController.m', line = 21, exact_match = 0, locations = 1, resolved = 1, hit count = 8

  1.1: where = LLDB调试`-[ViewController touchesBegan:withEvent:] at ViewController.m:21, address = 0x00000001094e2b30, resolved, hit count = 8 

3: regex = 'touchBegan', locations = 5, resolved = 4, hit count = 0
  3.1: where = UIKitCore`-[_UIFocusFastScrollingRecognizer focusEnginePanGesture:touchBeganAtDigitizerLocation:], address = 0x00007fff47371559, resolved, hit count = 0 
  3.2: where = UIKitCore`-[UIKeyboardMenuView showAsHUDFromLocation:withInputView:touchBegan:], address = 0x00007fff4750b652, resolved, hit count = 0 
  3.3: where = UIKitCore`-[_UITextDocumentInterface _setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff47518923, resolved, hit count = 0 
  3.4: where = UIKitCore`-[_UIInputViewControllerOutput setInputModeList:touchBegan:fromLocation:updatePoint:], address = 0x00007fff475196ce, unresolved, hit count = 0  Options: disabled 
  3.5: where = MapKit`-[MKActionRowItemView _touchBegan], address = 0x00007fff2768f2d6, resolved, hit count = 0 

删除组内断点的时候,失败了,查询后发下组内断点还是存在的,说明删除断点的时候只能按照组进行删除,

5.查看 LLDB 的其他指令

  直接在LLDB 上 输入 :help 就可以查看其他的指令了,这里太多了,就不贴过来了;

    可以搜索部分比如:help breakpoint,就是查看 breakpoint下的所有指令。

输入:
help breakpoint
输出:
   Commands for operating on breakpoints (see 'help b' for shorthand.)

Syntax: breakpoint <subcommand> [<command-options>]

The following subcommands are supported:

      clear   -- Delete or disable breakpoints matching the specified source
                 file and line.
      command -- Commands for adding, removing and listing LLDB commands
                 executed when a breakpoint is hit.
      delete  -- Delete the specified breakpoint(s).  If no breakpoints are
                 specified, delete them all.
      disable -- Disable the specified breakpoint(s) without deleting them.  If
                 none are specified, disable all breakpoints.
      enable  -- Enable the specified disabled breakpoint(s). If no breakpoints
                 are specified, enable all of them.
      list    -- List some or all breakpoints at configurable levels of detail.
      modify  -- Modify the options on a breakpoint or set of breakpoints in
                 the executable.  If no breakpoint is specified, acts on the
                 last created breakpoint.  With the exception of -e, -d and -i,
                 passing an empty argument clears the modification.
      name    -- Commands to manage name tags for breakpoints
      read    -- Read and set the breakpoints previously saved to a file with
                 "breakpoint write".  
      set     -- Sets a breakpoint or set of breakpoints in the executable.
      write   -- Write the breakpoints listed to a file that can be read in
                 with "breakpoint read".  If given no arguments, writes all
                 breakpoints.

For more help on any particular subcommand, type 'help <command> <subcommand>'.

 6.断点的简写

  b -f ViewController.m -r Clicked: 等同于:breakpoint set --file ViewController.m -r Clicked:

  • b :breakpoint set
  • -f--file
  • -n--name

 但是 breakpoint list 、breakpoint disable 等只能简写成 break libreak dis ,因为简写的 b 后面默认会带上 set 的。

这一篇文章主要描述一下LLDB中我们经常使用的断点调试方式,下一篇文章讲下LLDB的进阶用法。

原创文章 88 获赞 21 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ZhaiAlan/article/details/104605142