Ios 什么是lldb未命名符号?

Ios 什么是lldb未命名符号?,ios,objective-c,reverse-engineering,lldb,Ios,Objective C,Reverse Engineering,Lldb,我想在第三方类实例方法上设置断点 br set -r "\[ThirdPartyClass .*\]$" 但是我得到了(没有位置) 然后我想查找这个类并找出它的错误 image lookup -t ThirdPartyClass 输出为空。事情变得很奇怪 最后,我使用hopper查找实例方法的地址偏移量,类似于这样 -[ThirdPartyClass aMethod:]: 00000001008f83b8 stp x22

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

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

那么,什么是未命名符号?这个类在哪里?为什么我找不到它?

在应用程序的主可执行文件中,Objective-C代码被剥离,因此LLDB无法读取这些符号。这与动态链接框架不同,在动态链接框架中,您仍然可以解析符号

这就是说,您正在追求Objective-C,因此您可以使用Objective-C运行时来对抗自身。有很多方法可以在加载到内存时找到该方法的位置。但是,由于我看到您在该断点中使用了regex选项,我建议您看看这个定制的LLDB脚本,它可以在主可执行文件中搜索剥离类

此命令称为“查找”,可按如下方式使用:


(lldb)查找-X\[ThirdPartyClass\s

使用-l参数可以获得这些方法的加载地址

(lldb)查找-X-l\[ThirdPartyClass\s

当然,您可以使用-B选项在所有这些方法上设置断点

(lldb)查找-X-B\[ThirdPartyClass\s


您可以看到此视频中正在使用此查找命令,

出现
\uulldb\u unnamed\u symbol
消息,因为我使用的是为
版本编译的第三方框架

rm -Rf Carthage
carthage update --platform iOS --configuration Debug
在我的例子中,它们是由迦太基提供的,所以我可以切换到使用
Debug
builds

rm -Rf Carthage
carthage update --platform iOS --configuration Debug
执行此操作后,结果表明错误是由于一个失败的断言造成的,该断言在发布模式下在未知符号上停止,但在调试模式下生成了一个可用的堆栈跟踪

cocoapod可能有一些等价物,或者您正在使用这些第三方框架


在为应用商店构建归档时,只需确保使用框架的
Release
版本。

还需要注意的是,正则表达式不会为类
ThirdPartyClass
捕获任何类别方法,因为签名类似于:-[ThirdPartyClass(SomeCategoryName)aMethodWithParam:]谢谢你的详细回答和注释。它们非常有用。我忘了在上面说。那就是uuuuuulldb_unnamed_symbol98是我想设置断点的方法。它刚刚丢失了符号,我不知道为什么。我将尝试这些lldb自定义脚本。也许它们会工作。它们是否?(有相同的问题)