LLDB如何在OC中使用文件定义的宏

问题描述 投票:0回答:1

我已经尝试过这种方法的多种变体,但似乎都没有用。有任何想法吗?

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) 
ios lldb
1个回答
1
投票

传统上,调试信息不​​能很好地支持宏。 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

),然后您可以导入已创建的模块,其定义将对表达式解析器可用。

© www.soinside.com 2019 - 2024. All rights reserved.