菜鸟教程小白 发表于 2022-12-13 10:49:14

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


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

<pre><code>    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`- + 130
    frame #8: 0x2f9e8068 Foundation`+ + 60
* frame #9: 0x002ce4e0 myApp`PFMD5HashFromData(data=0x18109b60) + 412 at PFHash.m:63
    frame #10: 0x002d4e42 myApp`-(self=0x18109890, _cmd=0x31facc39, object=0x18138b90) + 286 at PFInternalUtils.m:286
    frame #11: 0x002d500a myApp`+(self=0x006e00c8, _cmd=0x0058acb3, object=0x18138b90) + 74 at PFInternalUtils.m:300
    frame #12: 0x002e56d8 myApp`-
</code></pre>

<h3>我对 SO 社区的问题是:</h3>

<p><strong>是否可以使用 LLDB 调试控制台查看特定内存地址处的人类可读数据</strong>? </p>

<p>例如,显示如下的值:</p>

<pre><code>(self=0x18109890, _cmd=0x31facc39, object=0x18138b90)
</code></pre>

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

<p><strong>例如:</strong>如果我在内存中有以下值:</p>

<pre><code>// NSString @ memory address: 0x123456
NSString *example = @&#34;exampleString&#34;;
</code></pre>

<p>我可以使用什么 LLDB 命令来查看内存地址 <code>0x123456</code> 处 <code>exampleString</code> 的人类可读值?</p>

<p>根据其他人的建议(感谢 <a href="https://stackoverflow.com/users/2465073/jim-ingham" rel="noreferrer noopener nofollow">Jim Ingham</a> )和各种互联网搜索,我尝试了以下命令:</p>

<ul>
<li><code>(lldb) expr *((MyObjectType *) 0x123456)</code></li>
<li><code>(lldb) 帧变量 *object</code></li>
<li><code>内存读取-s1 -fu -c10000 0x123456 --force</code></li>
</ul>

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

<h2>更新</h2>

<p>我终于能够根据到目前为止在这篇文章中收到的建议打印这些值。我获得更多神秘内存地址的原因是因为我试图评估预编译的二进制文件。当我针对我自己的项目代码运行建议的命令时,一切正常。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当然。如果您想要原始内存转储,请尝试 <code>memory read</code> 命令。如果你有对象类型的调试信息,你可以将它传递给 <code>-t</code> 选项到 <code>memory read</code> (这对于对象数组更有用。)</p>

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

<pre><code>(lldb) expr ((MyObjectType *) 0x18138b90)
</code></pre>

<p>如果你在带有调试信息的框架中,你也可以使用 <code>frame variable</code> 来查看局部变量和参数。比如:</p>

<pre><code>(lldb) frame variable *object
</code></pre>

<p>应该显示<code>object</code>的内容。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - LLDB 命令用于查看特定内存地址处的人类可读值,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32555447/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32555447/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - LLDB 命令用于查看特定内存地址处的人类可读值