什么是___lldb_unnamed_symbol?

5

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

br set -r "\[ThirdPartyClass .*\]$"

但是我得到了(没有位置)

然后我想查找这个类并找出其中的问题。

image lookup -t ThirdPartyClass

输出为空,情况变得奇怪起来。

最终,我使用hopper查找实例方法的地址偏移量,大概是这样的。

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

使用以下方法查找基地址。

image list -f -o
[  0] /Users/TEP/Library/Developer/Xcode/DerivedData/XXXXXX 0x00000000009e8000

当我混淆了所有这些地址时。
image lookup -a 0x00000000009e8000+0x0000001008f83b8

我收到了这个信息:
  Address: XXXXXXX[0x00000001008f83b8] (XXXXXXXX.__TEXT.__text + 9376552)
  Summary: XXXXXXXXXX`___lldb_unnamed_symbol98$$XXXXXXXXXX

那么,什么是___lldb_unnamed_symbol?这个类在哪里,为什么我找不到它?
2个回答

4
在应用程序的主可执行文件中,Objective-C代码被剥离,因此LLDB无法读取这些符号。这与动态链接框架不同,后者仍然可以解析符号。
话虽如此,由于你正在寻找Objective-C,所以可以使用Objective-C运行时来对其进行操作。有许多方法可以找到加载到内存中的该方法的位置。但是因为我看到您在断点中使用了正则表达式选项,所以建议您查看这个自定义的LLDB脚本,它可以搜索已剥离类的主可执行文件。

https://github.com/DerekSelander/LLDB/blob/master/lldb_commands/lookup.py

这个命令叫做“lookup”,可以这样使用:
(lldb) lookup -X \[ThirdPartyClass\s
使用“-l”参数,您可以获取这些方法的加载地址:
(lldb) lookup -X -l \[ThirdPartyClass\s
当然,您也可以使用“-B”选项在所有这些方法上设置断点:
(lldb) lookup -X -B \[ThirdPartyClass\s
您可以在此视频中看到使用此查找命令 https://youtu.be/gxfrJuxwblI?t=20m50s

还要注意的是,正则表达式不会捕获ThirdPartyClass类的任何类别方法,因为签名看起来像这样:-[ThirdPartyClass(SomeCategoryName) aMethodWithParam:] - Sozin's Comet
谢谢您详细的回答和备注,它们非常有帮助。 我刚才忘了说了。*___lldb_unnamed_symbol98* 是我想要设置断点的方法。它只是失去了它的符号,我不知道为什么。 我将尝试这些LLDB自定义脚本。也许它们会起作用。 - Tepmnthar
他们有同样的问题吗? - ctietze

3

我遇到了__lldb_unnamed_symbol消息,因为我正在使用为Release构建编译的第三方框架。

在我的情况下,这些框架是由Carthage提供的,所以我只需要切换到使用Debug构建即可。

rm -Rf Carthage
carthage update --platform iOS --configuration Debug

在进行此操作后,结果表明错误是由于失败的断言引起的。在发布模式下,它会停止在未知符号上,但在调试模式下会生成可用的堆栈跟踪。

可能还有一些类似的Cocoapods或者其他方式引入第三方框架的等价物。

确保你在打包应用商店版本时使用Release版本的框架。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接