【问题标题】:LLDB command to view human-readable values at specific memory addressesLLDB 命令用于查看特定内存地址处的人类可读值
【发布时间】:2015-09-13 23:16:39
【问题描述】:

我在我的 iOS 应用程序中遇到了一个错误,堆栈跟踪并不是特别有启发性。当我在 (lldb) 调试器控制台上运行命令 bt 时,它会吐出完整的回溯,如下所示:

    frame #0: 0x39de23e4 libsystem_c.dylib`__vfprintf + 28
    frame #1: 0x39df82c6 libsystem_c.dylib`__v2printf + 374
    frame #2: 0x39da723c libsystem_c.dylib`_vsnprintf + 348
    frame #3: 0x39da7b2c libsystem_c.dylib`vsnprintf_l + 32
    frame #4: 0x39da7b06 libsystem_c.dylib`snprintf_l + 22
    frame #5: 0x2f0a19d0 CoreFoundation`__CFStringAppendFormatCore + 8464
    frame #6: 0x2f010610 CoreFoundation`_CFStringCreateWithFormatAndArgumentsAux + 76
    frame #7: 0x2f9e8162 Foundation`-[NSPlaceholderString initWithFormat:locale:arguments:] + 130
    frame #8: 0x2f9e8068 Foundation`+[NSString stringWithFormat:] + 60
  * frame #9: 0x002ce4e0 myApp`PFMD5HashFromData(data=0x18109b60) + 412 at PFHash.m:63
    frame #10: 0x002d4e42 myApp`-[PFJSONCacheItem initWithObject:](self=0x18109890, _cmd=0x31facc39, object=0x18138b90) + 286 at PFInternalUtils.m:286
    frame #11: 0x002d500a myApp`+[PFJSONCacheItem cacheFromObject:](self=0x006e00c8, _cmd=0x0058acb3, object=0x18138b90) + 74 at PFInternalUtils.m:300
    frame #12: 0x002e56d8 myApp`-[PFObject(self=0x18151620, _cmd=0x0058bdd1, object=0x18138b90, key=0x0064a2e8) checkForChangesToMutableContainer:forKey:] 

我对 SO 社区的问题是:

是否可以使用 LLDB 调试控制台查看特定内存地址的人类可读数据

例如,显示如下的值:

(self=0x18109890, _cmd=0x31facc39, object=0x18138b90)

我可以打印出这些值以便查看这些内存地址的数据吗?

例如:如果我在内存中有以下值:

// NSString @ memory address: 0x123456
NSString *example = @"exampleString"; 

我可以使用什么 LLDB 命令来查看内存地址 exampleString 的人类可读值 0x123456

根据其他人的建议(感谢Jim Ingham)和各种互联网搜索,我尝试了以下命令:

  • (lldb) expr *((MyObjectType *) 0x123456)
  • (lldb) frame variable *object
  • memory read -s1 -fu -c10000 0x123456 --force

还有一些其他的,但所有这些都给了我更多的内存地址,或者不是人类可读的内存转储。我希望做的是读取或打印出将流经我的程序的实际值,以查看可能出现问题的一些线索。

更新

我终于能够根据到目前为止在这篇文章中收到的建议打印这些值。我获得更多神秘内存地址的原因是因为我试图评估预编译的二进制文件。当我针对我自己的项目代码运行建议的命令时,一切正常。

【问题讨论】:

    标签: ios objective-c xcode debugging lldb


    【解决方案1】:

    当然。如果您想要原始内存转储,请尝试memory read 命令。如果您有对象类型的调试信息,您可以将其传递给-t 选项到memory read(这对于对象数组更有用。)

    或者您可以使用表达式解析器,例如:

    (lldb) expr ((MyObjectType *) 0x18138b90)
    

    如果您在带有调试信息的框架中,您还可以使用frame variable 查看本地和参数。比如:

    (lldb) frame variable *object
    

    应该显示object的内容。

    【讨论】:

    • 太棒了。这看起来非常有用。我将测试这些想法并在有机会时立即报告。谢谢!
    • 我对原始帖子进行了一些更新,以阐明我在寻找什么。您的贡献很有帮助,但它们给了我越来越多的内存地址或内存转储,这些内存地址或内存转储与回溯一样难以阅读。我无法使用您建议的这些命令来实际查看内存中项目的值(例如,NSString 的内容,或 NSDictionary 中保存的项目)。你知道怎么做吗?再次感谢您的帮助。
    • 你能不能试试这个:expr ((MyObjectType *) 0x18138b90) (和吉姆的想法一样,但没有前缀星号)。对于像 NSString 和 NSDictionary 这样的东西,我们绝对应该允许您尝试实现的那种用户友好的检查。
    • 结合 Jim Ingram 的建议和@EnricoGranata,我能够正确打印这些值,感谢你们俩。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 2012-08-14
    • 2012-08-13
    • 2015-04-02
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多