菜鸟教程小白 发表于 2022-12-13 15:53:43

ios - 什么是___lldb_unnamed_symbol?


                                            <p><p>我想在第三方类实例方法上设置断点。</p>

<pre><code>br set -r &#34;\$&#34;
</code></pre>

<p>但是我得到了<strong>(没有位置)</strong>。</p>

<p>然后我想查找这个类,发现它有什么问题。</p>

<pre><code>image lookup -t ThirdPartyClass
</code></pre>

<p>输出为空。事情变得很奇怪。</p>

<p>最后,我使用 hopper 来查找实例方法的地址偏移量,如下所示。</p>

<pre><code>                     -:
00000001008f83b8         stp      x22, x21, !                     ; Objective C Implementation defined at 0x101098168 (instance method), DATA XREF=0x101098168
00000001008f83bc         stp      x20, x19,
00000001008f83c0         stp      x29, x30,
00000001008f83c4         add      x29, sp, #0x20
00000001008f83c8         mov      x19, x2
00000001008f83cc         mov      x20, x0
00000001008f83d0         adrp       x8, #0x101102000
00000001008f83d4         ldr      x1,
00000001008f83d8         mov      x0, x19
00000001008f83dc         bl         imp___stubs__objc_msgSend
00000001008f83e0         adrp       x8, #0x101116000
00000001008f83e4         ldrsw      x21,
00000001008f83e8         ldr      x0, x20, x21
00000001008f83ec         adrp       x8, #0x101102000
00000001008f83f0         ldr      x1,
00000001008f83f4         bl         imp___stubs__objc_msgSend
00000001008f83f8         str      x19, x20, x21
00000001008f83fc         ldp      x29, x30,
00000001008f8400         ldp      x20, x19,
00000001008f8404         ldp      x22, x21, !, #0x30
00000001008f8408         ret
</code></pre>

<p>然后用这个找到基地址。</p>

<pre><code>image list -f -o
/Users/TEP/Library/Developer/Xcode/DerivedData/XXXXXX 0x00000000009e8000
</code></pre>

<p>当我混淆了所有这些地址时。</p>

<pre><code>image lookup -a 0x00000000009e8000+0x0000001008f83b8
</code></pre>

<p>我知道了:</p>

<pre><code>Address: XXXXXXX (XXXXXXXX.__TEXT.__text + 9376552)
Summary: XXXXXXXXXX`___lldb_unnamed_symbol98$$XXXXXXXXXX
</code></pre>

<p>那么,<strong>___lldb_unnamed_symbol</strong> 是什么?这门课在哪里,为什么我找不到?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在应用程序的主要可执行文件中,Objective-C 代码被剥离,因此 LLDB 无法读取这些符号。这与动态链接框架不同,您仍然可以解析符号。</p>

<p>话虽如此,您正在使用 Objective-C,因此您可以使用 Objective-C 运行时来对抗自身。当加载到内存中时,有多种方法可以找到该方法的位置。但是由于我看到您在该断点中使用了正则表达式选项,因此我建议您查看这个自定义 LLDB 脚本,该脚本可以搜索主可执行文件以查找已剥离的类</p>

<p> <a href="https://github.com/DerekSelander/LLDB/blob/master/lldb_commands/lookup.py" rel="noreferrer noopener nofollow">https://github.com/DerekSelander/LLDB/blob/master/lldb_commands/lookup.py</a> </p>

<p>这个名为<strong>lookup</strong>的命令可以这样使用:</p>

<p><code>
(lldb) 查找 -X\[ThirdPartyClass\s
</code></p>

<p>使用 -l 参数可以获得这些方法的加载地址
<code>
(lldb) 查找 -X -l\[ThirdPartyClass\s
</code></p>

<p>当然,您可以使用 -B 选项在所有这些方法上设置断点
<code>
(lldb) 查找 -X -B\[ThirdPartyClass\s
</code></p>

<p>您可以在此视频中看到此查找命令 <a href="https://youtu.be/gxfrJuxwblI?t=20m50s" rel="noreferrer noopener nofollow">https://youtu.be/gxfrJuxwblI?t=20m50s</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 什么是___lldb_unnamed_symbol?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47922665/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47922665/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 什么是___lldb_unnamed_symbol?