gpt4 book ai didi

ios - 无法在 Xcode 调试器中按名称解析枚举值

转载 作者:行者123 更新时间:2023-12-02 06:22:07 26 4
gpt4 key购买 nike

通过在整个项目中使用的全局头文件中的枚举类型定义,我在 Xcode 中使用 lldb 时无法按名称引用各个枚举值。

例如,如果我在枚举类型可用的任何地方的断点处停止,并且尝试在 Xcode 中的 lldb 提示符处计算某些内容(例如 (lldb) p (int)EnumConstant) ,lldb 提示:

error: use of undeclared identifier 'EnumConstant'

此外,如果我尝试在条件中使用枚举常量设置条件断点(例如,在 Xcode 中右键单击断点>编辑断点...>条件:EnumConstant == someLocalVar),然后 Xcode 每次尝试在该断点处评估该条件时都会提示:

Stopped due to an error evaluating condition of breakpoint 1.1: "EnumConstant == someLocalVar"
Couldn't parse conditional expression:
error: use of undeclared identifier 'EnumConstant'

当我开始在“编辑断点...”窗口中输入名称时,Xcode 的代码完成弹出窗口甚至可以解决枚举常量的建议,因此 Xcode 本身在解决该问题时不会出现问题。

我可以在 lldb 或 Xcode 中设置一个选项,以便 lldb 在编译后维护枚举标识符吗?我假设枚举常量在编译期间被转换为其序数值,导致可执行文件丢弃标识符,但这只是我天真的猜测。

当我在 Linux 或 Cygwin 中的简单 GNU C 程序中使用等效代码(显然减去类定义),但使用 gcc/gdb 而不是 Xcode/lldb 时,我不会遇到这些问题。它能够毫无问题地解析枚举值。

<小时/>

我创建了一个小型 Xcode iPhone 项目来演示我的意思。在 ViewController.m 上下文中使用下面的任何 enum_t 常量(for 循环是演示的好地方)将产生相同的结果。

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

typedef enum
{
eZero, eOne, eTwo, eCOUNT
}
enum_t;

extern NSString const * const ENUM_STR[];

@end

ViewController.m:

#import "ViewController.h"

@implementation ViewController

NSString const * const ENUM_STR[eCOUNT] = { @"eZero", @"eOne", @"eTwo" };

- (void)viewDidLoad
{
[super viewDidLoad];

for (enum_t value = eZero; value < eCOUNT; ++value)
{
NSLog(@"%-8@ = %d", ENUM_STR[value], value);
}
}

@end

最佳答案

这是一个关于如何构建枚举的名称->调试信息查找加速器表的错误(相当长期)。虽然列出了枚举类型,但没有列出枚举值。这样做肯定是为了节省输出调试信息的大小 - 调试信息很快就会变得很大,因此添加更多信息的成本和更多信息的效用之间存在持续的紧张关系。到目前为止,这还没有上升到包容的水平。

无论如何,即使对于规模相当大的项目来说,搜索“名称与‘eZero’匹配的任何内容的所有调试信息”也会非常慢,而且对于大型项目来说会变得非常糟糕。因此 lldb 始终使用这些名称->调试信息表进行第一级访问。

因为加速器表确实包含按名称列出的枚举类型(对您按名称进行类型定义也更重要),所以解决方法是:

(lldb) expr enum_t::eZero(整数)$0 = 0

当然,如果您有真正的匿名枚举,那么在将此信息添加到加速器表之前您就很不走运。

顺便说一句,调试器控制台窗口中的 Xcode 符号补全是使用 Xcode SourceKit 索引器而不是 lldb 完成的。因此 Xcode 提供的补全并不反射(reflect) lldb 对程序的了解。

BBTW,gdb 不使用编译器制作的加速器表(这些是 Apple 扩展,直到新的 DWARF 5 标准),而是通过扫描调试信息手动构建索引。这使得他们可以对调试器认为最好的内容进行索引。 OTOH,对于大型项目来说,它使调试器启动速度相当慢。

关于ios - 无法在 Xcode 调试器中按名称解析枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50956403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com