草庐IT

ios - 用于查看特定内存地址处人类可读值的 LLDB 命令

coder 2024-01-23 原文

我在我的 iOS 应用程序中遇到了一个错误,并且 Stack Trace 并不是特别有启发性。当我在 (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 命令来查看内存地址 0x123456 处的 exampleString 的人类可读值?

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

  • (lldb) expr *((MyObjectType *) 0x123456)
  • (lldb) 框架变量 *object
  • 内存读取-s1 -fu -c10000 0x123456 --force

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

更新

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

最佳答案

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

或者你可以使用表达式解析器,像这样:

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

如果您在带有调试信息的框架中,您还可以使用框架变量来查看局部变量和参数。例如:

(lldb) frame variable *object

应该向您显示对象的内容。

关于ios - 用于查看特定内存地址处人类可读值的 LLDB 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32555447/

有关ios - 用于查看特定内存地址处人类可读值的 LLDB 命令的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  7. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  8. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  9. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐