什么是 ___lldb_unnamed_symbol?
What is ___lldb_unnamed_symbol?
我想在第三方class实例方法上设置断点。
br set -r "\[ThirdPartyClass .*\]$"
但是我得到了(没有位置)。
然后我想查一下这个class,看看有什么问题。
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?这个 class 在哪里,为什么我找不到它?
在应用程序的主要可执行文件中,Objective-C 代码被剥离,因此 LLDB 无法读取这些符号。这与动态链接框架不同,在动态链接框架中您仍然可以解析符号。
话虽这么说,你要追求 Objective-C,所以你可以使用 Objective-C 运行时来对抗它自己。加载到内存中时,有多种方法可以找到该方法的位置。但是由于我看到您在该断点中使用了 regex 选项,我建议您看一下这个自定义 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
我收到 __lldb_unnamed_symbol
消息,因为我使用的是为 Release
构建编译的第 3 方框架。
在我的例子中,它们是由 Carthage 提供的,所以我可以切换到使用 Debug
构建。
rm -Rf Carthage
carthage update --platform iOS --configuration Debug
执行此操作后,发现错误是由于断言失败造成的,该断言在发布模式下停止在未知符号上,但在调试模式下产生了可用的堆栈跟踪。
Cocoapods 可能有一些等价物,或者您正在引入那些第 3 方框架。
在为应用商店构建存档时,请确保使用 Release
个版本的框架。
我想在第三方class实例方法上设置断点。
br set -r "\[ThirdPartyClass .*\]$"
但是我得到了(没有位置)。
然后我想查一下这个class,看看有什么问题。
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?这个 class 在哪里,为什么我找不到它?
在应用程序的主要可执行文件中,Objective-C 代码被剥离,因此 LLDB 无法读取这些符号。这与动态链接框架不同,在动态链接框架中您仍然可以解析符号。
话虽这么说,你要追求 Objective-C,所以你可以使用 Objective-C 运行时来对抗它自己。加载到内存中时,有多种方法可以找到该方法的位置。但是由于我看到您在该断点中使用了 regex 选项,我建议您看一下这个自定义 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
我收到 __lldb_unnamed_symbol
消息,因为我使用的是为 Release
构建编译的第 3 方框架。
在我的例子中,它们是由 Carthage 提供的,所以我可以切换到使用 Debug
构建。
rm -Rf Carthage
carthage update --platform iOS --configuration Debug
执行此操作后,发现错误是由于断言失败造成的,该断言在发布模式下停止在未知符号上,但在调试模式下产生了可用的堆栈跟踪。
Cocoapods 可能有一些等价物,或者您正在引入那些第 3 方框架。
在为应用商店构建存档时,请确保使用 Release
个版本的框架。