我已经尝试过这种方法的多种变体,但似乎都没有用。有任何想法吗?
在ViewController.m
中
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 300, 300)];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];
另一个文件UIView+Frame.h
我定义了一个颜色宏
#define RGBACOLOR(r,g,b,a) [UIColor colorWithRGB:r Green:g Blue:b Alpha:a]
Actual operation当程序执行[self.view addSubview: view1];
时,我将使用LLDB使用已定义的宏来修改颜色,但是会提示错误,并且我不知道如何修改它。错误的结果如下
(lldb) e view1.backgroundColor = (UIColor *)RGBACOLOR(0,0,0,1)
error: use of undeclared identifier 'RGBACOLOR'
(lldb)
传统上,调试信息不能很好地支持宏。 DWARF标准(这是macOS和其他Unixen上最常见的标准)有一种存储信息的方法,但是它非常冗长,很少有工具链支持它。因此,调试器没有自然的方法来了解定义。
[如果您要在调试表达式中使用少量的相当独立的宏,则可以将它们放在.h文件中,并将该文件设置为lldb的“表达式前缀”。这将包含在随后运行的每个表达式的源代码中。通过以下方式执行此操作:
(lldb) settings set target.expr-prefix ~/my-common-defines.h
您在这里不能抱有太大的野心(例如#include <unistd.h>
无效)。问题在于大多数系统头文件都由一组其他#defines限制。 lldb不知道它们的值是什么,因此在某些时候预处理expr-prefix将会失败。
或者,clang也有一个称为“模块”的概念,它是为了使某些软件包的标头集合更可共享以进行重复编译。它实际上捕获了一些可能导致expr-prefix解析失败的信息。因此,如果要访问的宏位于Clang模块内置的一组标头中,则可以将该模块导入lldb的表达式上下文中,这也将使这些模块中的定义也可用。因此,例如:
((lldb)expr -l objc-@import Foundation
将使所有基金会宏定义可用。
同样,如果您的标头是模块化的(此页深入介绍了它的含义:
https://clang.llvm.org/docs/Modules.html
),然后您可以导入已创建的模块,其定义将对表达式解析器可用。