在lldb表达式上下文中使用Objective-C创建一个类

问题描述

我试图在lldb表达式上下文中使用Objective-C声明和实例化一个类。我启动一个可执行文件并通过lldb附加到它。可执行文件停止后,我将执行表达式。

(lldb) e -l objc --
Enter expressions,then terminate with an empty line to evaluate:
  1: @import Foundation; 
  2: @implementation MyClass : NSObject 
  3: - (void)foo { 
  4:     NSLog(@"bar"); 
  5: } 
  6: @end 
  7: [[MyClass new] foo]; 
error: <user expression 15>:2:1: unexpected '@' in program
@implementation MyClass : NSObject
^

Swift中的等效表达式似乎工作正常。

(lldb) e -l swift -- 
Enter expressions,then terminate with an empty line to evaluate:
  1: class MyClass { 
  2: func foo { print("bar") } 
  3: } 
  4: MyClass().foo() 
  5:  

bar

我正在使用Xcode 11.7工具链附带的lldb-1103.0.22.10。

是否可以在lldb表达式中使用Objective-C声明和实例化一个类?

解决方法

应该(我从未尝试过,所以不能肯定地说),但是还需要更多工作。问题是您必须在ObjC运行时中注册新类。在最常见的情况下,当加载包含类实现的dylib或可执行文件时,由动态加载程序完成向ObjC运行时注册类的工作。由于lldb表达式不是dylib(以这种方式包装它们会很繁重),因此对于新类而言,这还没有完成。

但是,objc运行时中有一些函数可以让您动态添加类。您可以使用它们来注册新课程。在ObjC运行时信息页面上有关于这些功能的一些信息:

https://developer.apple.com/documentation/objectivec/objective-c_runtime

lldb的表达式解析器可以扫描表达式的结果以查找新的ObjC类,并为您手动注册它们。目前还没有这样做。您可以向http://bugs.llvm.org提出增强请求,看看是否有人对添加此功能感兴趣。但是,这有点深奥。

Swift运行时的工作方式与ObjC运行时不同,不需要额外的工作。