在 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 运行时的工作方式不同,不需要这些额外的工作。
我正在尝试在 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 运行时的工作方式不同,不需要这些额外的工作。