问题描述
我试图在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运行时不同,不需要额外的工作。