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

Create a class using Objective-C in the lldb expression context

我正在尝试在 lldb 表达式上下文中使用 Objective-C 声明和实例化 class。我启动一个可执行文件并通过 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 声明和实例化一个 class?

它应该是(我从未尝试过所以我不能肯定地说)但是它需要更多的工作。问题是您必须在 ObjC 运行时注册新的 class。在最常见的情况下,在加载包含 class 实现的 dylib 或可执行文件时,向 ObjC 运行时注册 class 的工作是由动态加载程序完成的。由于 lldb 表达式不是 dylib(以这种方式包装它们太过 heavy-weight),这不会为您的新 class.

完成

但是,objc 运行时中有一些函数允许您动态添加 classes。您可以使用它们来注册您的新 class。 ObjC 运行时信息页面上有一些关于这些函数的信息:

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

lldb 的表达式解析器可以扫描新 ObjC classes 的表达式结果并为您手动注册它们。它目前不这样做。您可以使用 http://bugs.llvm.org 提交增强请求,看看是否有人有兴趣添加此功能。然而,它有点深奥。

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