【问题标题】:How to use enum in lldb如何在lldb中使用枚举
【发布时间】:2015-10-15 11:08:59
【问题描述】:

我收到此错误,是否需要使用特定语法才能在 LLDB 中使用 enum

(lldb) expr NSString *$text = [[NSString alloc] initWithData:$data encoding:NSUTF8StringEncoding]
error: use of undeclared identifier 'NSUTF8StringEncoding'
error: 1 errors parsing expression

注意:数据在我的上下文中有效且类型正确

在使用实际而不是我得到的枚举时进行编辑

expr NSString *$text = [[NSString alloc] initWithData:$data encoding:(NSStringEncoding)4]
error: no known method '-initWithData:encoding:'; cast the message send to the method's return type
error: 1 errors parsing expression

我尝试过使用和不使用强制转换为 (NSStringEncoding)

使用值的解决方案

expr NSString *$text = (NSString *)[[NSString alloc] initWithData:$data encoding:4]

由于我使用 -initWithData:encoding:(使用 NSUInteger 类型进行编码)lldb 无法推断整个方法的返回类型,因此我也必须强制转换返回类型。

【问题讨论】:

    标签: ios objective-c lldb


    【解决方案1】:

    枚举的调试信息与 lldb 搜索符号的模式不匹配,如果未指定枚举名称,则搜索特定枚举值的成本非常高。目前,如果其他一些操作没有导致枚举调试信息被带入,lldb 将找不到它。不幸的是,NSStringEncoding 枚举是一个匿名枚举,因此无法通过 name::value 指定值。

    但是,如果您使用的是 Xcode 7.x,则可以将基础模块导入 lldb 用于表达式解析的编译器:

    (lldb) expr @import Foundation
    

    然后 lldb 会找到这个枚举值(以及许多其他的东西,比如宏和更准确的方法类型。)

    注意,如果您觉得这很有用并且您正在使用 Xcode,您可以通过在 main 上设置一个符号断点、使用此调试器命令添加一个“动作”并将其设置为自动继续来自动实现这一点。

    一旦该功能在野外有更多的时间,我们可能会自动执行此操作。

    【讨论】:

    • 太棒了!感谢您的详细解释和提示。
    【解决方案2】:

    NSUTF8StringEncoding 来自 NSUInteger 枚举,它等于 4:

    typedef NSUInteger NSStringEncoding;
    ...
     NSUTF8StringEncoding = 4,
    

    所以对于 lldb 命令,你可以像这样传递 smth:

    (lldb) po [[NSString alloc] initWithData:$data encoding:4]
    

    【讨论】:

    • 感谢我刚刚想到的答案,实际上有没有办法直接使用枚举而不是它的值?
    【解决方案3】:

    关于使用lldb 调试器命令,请参阅此nice blog

    您的解决方案是像这样直接传递NSUTF8StringEncoding 的枚举值:

    expr NSString *$text = (NSString *)[[NSString alloc] initWithData:data encoding:4]
    

    【讨论】:

    • 感谢我刚刚想到的答案,实际上有没有办法直接使用枚举而不是它的值?
    • 好吧,我不这么认为。不过,我很想看到这样的选择!
    • expr NSString *$text = [[NSString alloc] initWithData:$data encoding:(NSUInteger)4] error: no known method '-initWithData:encoding:'; cast the message send to the method's return type error: 1 errors parsing expression 你也明白了吗?
    • 试试这个expr NSString *$text = (NSString *)[[NSString alloc] initWithData:data encoding:(NSUInteger)4]
    • 很好,它工作,lldb实际上是在抱怨整个函数的返回类型,谢谢@Abhinav
    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2013-02-11
    • 2019-07-08
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多