iOS 没有 dsym 的崩溃报告符号化 - 在二进制文件中看到的地址之外的符号地址
iOS crash report symbolication without dsym - symbol address outside the addresses seen in the binary
我正在尝试符号化我没有 dsym 文件的 iOS 崩溃报告。我知道我将无法得到一个很好的 file_name : 行号符号,但是找出代码的汇编部分中崩溃的位置就足够了。
首先,这里是崩溃线程的堆栈跟踪:
Thread 3 name: Dispatch queue: com.unity3d.WebOperationQueue :: NSOperation 0x1483250e0 (QOS: USER_INTERACTIVE)
Thread 3 Crashed:
0 myapp 0x0000000100ec4738 0x100080000 + 14960440
1 myapp 0x000000010120e0fc 0x100080000 + 18407676
2 myapp 0x00000001011d7e00 0x100080000 + 18185728
3 myapp 0x0000000100085cfc 0x100080000 + 23804
4 CFNetwork 0x0000000185027780 __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke + 80
...
我有一个解密的二进制文件并验证了崩溃报告中的 uuid 和二进制文件匹配。要手动符号化堆栈地址,我这样做
atos -arch arm64 -o myapp -l 0x100080000 0x0000000100ec4738
我从上面的命令得到的输出是
0x0000000100e44738 (in myapp) + 544
这在一定程度上是预料之中的,因为我没有 dsym 文件。
请注意如果我们计算
也可以得到0x0000000100e44738
symbol address as = (slide + stack - load address)
幻灯片是 0x0000000100000000
(从 otool -arch arm64 -l myapp | grep -B 3 -A 8 -m 2 "__TEXT"
中找到的 vmaddr)
so 0x0000000100000000 + 0x0000000100ec4738 - 0x100080000 = 0x100e44738
与上述atos返回的地址相同。
现在的问题是,我在使用下面的 otool 命令
获得的二进制文件的 TEXT 部分的地址中没有找到 0x100e44738
符号地址
otool -tvV myapp
上面命令的开头是这样的。
myapp:
(__TEXT,__text) section
__ZNK5physx14NpSceneQueries10multiQueryINS_12PxRaycastHitEEEbRKNS_15MultiQueryInputERNS_13PxHitCallbackIT_EENS_7PxFlagsINS_9PxHitFlag4EnumEtEEPKNS_12PxQueryCacheERKNS_17PxQueryFilterDataEPNS_21PxQueryFilterCallbackEPNS_20BatchQueryFilterDataE:
0000000101262f40 stp x28, x27, [sp, #-96]!
0000000101262f44 stp x26, x25, [sp, #16]
0000000101262f48 stp x24, x23, [sp, #32]
0000000101262f4c stp x22, x21, [sp, #48]
0000000101262f50 stp x20, x19, [sp, #64]
0000000101262f54 stp x29, x30, [sp, #80]
...
我们可以清楚地看到otool -tvV (0x101262f40)
的起始地址大于symbol address (0x100e44738)
。所以我无法找到我错过的东西或如何从这里开始。
此堆栈跟踪是针对 SIGSEGV 异常的,我不确定这是否会改变任何内容。我在另一个带有 SIGABRT 异常的示例应用程序中尝试了完全相同的手动符号化步骤,我确实看到它能够指出程序集中的确切行崩溃。
非常感谢任何帮助或指点。
我看起来像 NSURLConnection
有问题。通常这意味着有一个委托没有在 dealloc 上正确取消设置(NSURLConnection
是分配 - 不弱所以你必须手动将它设置为 nil)。在您的代码中寻找使用 NSURLConnection
或其他类似网络的代码的地方。要特别注意将自己设置为网络请求委托的视图或 viewController,因为视图通常会在用户离开页面时留下内存。
我正在尝试符号化我没有 dsym 文件的 iOS 崩溃报告。我知道我将无法得到一个很好的 file_name : 行号符号,但是找出代码的汇编部分中崩溃的位置就足够了。
首先,这里是崩溃线程的堆栈跟踪:
Thread 3 name: Dispatch queue: com.unity3d.WebOperationQueue :: NSOperation 0x1483250e0 (QOS: USER_INTERACTIVE)
Thread 3 Crashed:
0 myapp 0x0000000100ec4738 0x100080000 + 14960440
1 myapp 0x000000010120e0fc 0x100080000 + 18407676
2 myapp 0x00000001011d7e00 0x100080000 + 18185728
3 myapp 0x0000000100085cfc 0x100080000 + 23804
4 CFNetwork 0x0000000185027780 __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke + 80
...
我有一个解密的二进制文件并验证了崩溃报告中的 uuid 和二进制文件匹配。要手动符号化堆栈地址,我这样做
atos -arch arm64 -o myapp -l 0x100080000 0x0000000100ec4738
我从上面的命令得到的输出是
0x0000000100e44738 (in myapp) + 544
这在一定程度上是预料之中的,因为我没有 dsym 文件。
请注意如果我们计算
也可以得到0x0000000100e44738
symbol address as = (slide + stack - load address)
幻灯片是 0x0000000100000000
(从 otool -arch arm64 -l myapp | grep -B 3 -A 8 -m 2 "__TEXT"
中找到的 vmaddr)
so 0x0000000100000000 + 0x0000000100ec4738 - 0x100080000 = 0x100e44738
与上述atos返回的地址相同。
现在的问题是,我在使用下面的 otool 命令
获得的二进制文件的 TEXT 部分的地址中没有找到0x100e44738
符号地址
otool -tvV myapp
上面命令的开头是这样的。
myapp:
(__TEXT,__text) section
__ZNK5physx14NpSceneQueries10multiQueryINS_12PxRaycastHitEEEbRKNS_15MultiQueryInputERNS_13PxHitCallbackIT_EENS_7PxFlagsINS_9PxHitFlag4EnumEtEEPKNS_12PxQueryCacheERKNS_17PxQueryFilterDataEPNS_21PxQueryFilterCallbackEPNS_20BatchQueryFilterDataE:
0000000101262f40 stp x28, x27, [sp, #-96]!
0000000101262f44 stp x26, x25, [sp, #16]
0000000101262f48 stp x24, x23, [sp, #32]
0000000101262f4c stp x22, x21, [sp, #48]
0000000101262f50 stp x20, x19, [sp, #64]
0000000101262f54 stp x29, x30, [sp, #80]
...
我们可以清楚地看到otool -tvV (0x101262f40)
的起始地址大于symbol address (0x100e44738)
。所以我无法找到我错过的东西或如何从这里开始。
此堆栈跟踪是针对 SIGSEGV 异常的,我不确定这是否会改变任何内容。我在另一个带有 SIGABRT 异常的示例应用程序中尝试了完全相同的手动符号化步骤,我确实看到它能够指出程序集中的确切行崩溃。
非常感谢任何帮助或指点。
我看起来像 NSURLConnection
有问题。通常这意味着有一个委托没有在 dealloc 上正确取消设置(NSURLConnection
是分配 - 不弱所以你必须手动将它设置为 nil)。在您的代码中寻找使用 NSURLConnection
或其他类似网络的代码的地方。要特别注意将自己设置为网络请求委托的视图或 viewController,因为视图通常会在用户离开页面时留下内存。