12 iphone debugging cocoa-touch
*更新* 我已经重新安装了Snow Leopard,干净安装.完全擦除了我现有的Leopard安装.同样的问题仍然存在.
我已尝试使用多种版本的symbolicatecrash来解析崩溃报告中的符号.从Apple提供的版本到Alan的Quatermain的版本发布在GitHub上,最后来自http://openradar.appspot.com/6438643.
无论出于何种原因,我可以得到的最好结果是我自己的库上的符号得到解决.通常,这足以让我指向正确的方向 - 有时则不是.使用2.x我可以在每个线程的堆栈跟踪中获取代码+ Apple提供的库时没有问题.
我的环境很可能是一个问题,我完全不怀疑Apple或Alan做过的工作.是的我确定我收藏的dSYM与生成崩溃报告的dSYM完全相同.
虽然'Foo'是我,并且从中获取符号非常棒,但我需要查看堆栈中其他函数的符号才能真正理解我的报告.
注意:对于在iPhone OS 2.2.1上运行应用程序崩溃的设备,获取所有符号都没有问题.这是一个iPhone OS 3.0问题.
此外,在详细模式下运行symbolicatecrash时,有些事情让我感到错误:
- NO MATCH
NOT searching in Spotlight for dsym with UUID of /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
## Warning: Can't find any unstripped binary that matches version of /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
..........fetching symbol file for libobjc.A.dylib--[undef]
Searching [/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0 (5A345)/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0 (5A347)/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0.1 (5B108)/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0.2 (5C1)/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.1.1/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.1/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.2.1/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.2/Symbols/usr/lib/libobjc.A.dylib /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.0 (7A341)/Symbols/usr/lib/libobjc.A.dylib]...--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0 (5A345)/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0 (5A347)/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0.1 (5B108)/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.0.2 (5C1)/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.1.1/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.1/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.2.1/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/2.2/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
--[/Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.0 (7A341)/Symbols/usr/lib/libobjc.A.dylib] -- NO MATCH
NOT searching in Spotlight for dsym with UUID of /usr/lib/libobjc.A.dylib
## Warning: Can't find any unstripped binary that matches version of /usr/lib/libobjc.A.dylib
Run Code Online (Sandbox Code Playgroud)
以下是通过symbolicatecrash运行崩溃报告后的示例:
Thread 0 Crashed:
0 libSystem.B.dylib 0x31dc476c 0x31d46000 + 517996
1 libSystem.B.dylib 0x31dc4755 0x31d46000 + 517973
2 Foo 0x00053075 uncaught_exception_handler + 21
3 CoreFoundation 0x3028f65f 0x301fd000 + 599647
4 libobjc.A.dylib 0x30013693 0x3000c000 + 30355
5 libstdc++.6.dylib 0x374ccc2d 0x3748a000 + 273453
6 libstdc++.6.dylib 0x374ccc81 0x3748a000 + 273537
7 libstdc++.6.dylib 0x374ccd4d 0x3748a000 + 273741
8 libobjc.A.dylib 0x300135ff 0x3000c000 + 30207
9 CoreFoundation 0x30222f2d 0x301fd000 + 155437
10 CoreFoundation 0x30222ecb 0x301fd000 + 155339
11 Foundation 0x30521e33 0x30501000 + 134707
12 Foundation 0x30570d47 0x30501000 + 458055
13 Foo 0x0000a1db -[Bar barfoo] (Bar.m:1617)
14 Foo 0x00032f73 -[MyViewController foobar] (MyViewController.m:727)
15 Foo 0x000329b9 -[MyViewController foobar] (MyViewController.m:666)
16 Foo 0x00031fab -[MyViewController tabBar:tabSelected:] (MyViewController.m:440)
17 Foo 0x00068d41 -[TTTabBar setSelectedTabIndex:] (TTTabBar.m:160)
18 Foo 0x00068ca3 -[TTTabBar setSelectedTabView:] (TTTabBar.m:142)
19 Foo 0x000689cf -[TTTabBar tabTouchedUp:] (TTTabBar.m:83)
20 CoreFoundation 0x302552f9 0x301fd000 + 361209
21 UIKit 0x3094d101 0x308ed000 + 393473
22 UIKit 0x3094d0a1 0x308ed000 + 393377
23 UIKit 0x3094d073 0x308ed000 + 393331
24 UIKit 0x3094cdcd 0x308ed000 + 392653
25 UIKit 0x309779c1 0x308ed000 + 567745
26 UIKit 0x30977011 0x308ed000 + 565265
27 UIKit 0x309767d9 0x308ed000 + 563161
28 UIKit 0x30923613 0x308ed000 + 222739
29 UIKit 0x30923163 0x308ed000 + 221539
30 GraphicsServices 0x32045a4d 0x32041000 + 19021
31 CoreFoundation 0x30253041 0x301fd000 + 352321
32 CoreFoundation 0x30252771 0x301fd000 + 350065
33 GraphicsServices 0x32044b0f 0x32041000 + 15119
34 GraphicsServices 0x32044bbb 0x32041000 + 15291
35 UIKit 0x308f0363 0x308ed000 + 13155
36 UIKit 0x308ef121 0x308ed000 + 8481
37 Foo 0x00002097 main (main.m:13)
Run Code Online (Sandbox Code Playgroud)
格雷格的建议,对我来说不起作用,但有助于指出正确的方向让plcrashreporter日志(记者版本103)再次用sdk 4.0进行符号化.
顺便说一句:这是一个问题,你肯定会在新设备(armv7)上创建报告,因为符号假设报告版本103是armv6.
从最新的symbolicatecrash脚本(sdk 4.0)中复制您所做的更改.注意:根据您使用的编辑器,您可能必须在编辑后设置可执行位.
chmod 755 symbolicatecrash
这是因为默认设置为armv6.
解决方案:sub parse_images设置默认架构 my $default_arch = 'armv7';
解决方案:(黑客:删除一些似乎不适用于103报告的限制)
更换:
$app = $bundlename if (!defined $app && defined $image{plus} && length $image{plus});
Run Code Online (Sandbox Code Playgroud)
通过:
$app = $bundlename if (!defined $app);
Run Code Online (Sandbox Code Playgroud)
解决方案:格雷格的解决方案sub matchesUUID.
更换:
} else { die "Can't understand the output from otool ($TEST_uuid)"; }
Run Code Online (Sandbox Code Playgroud)
通过:
} else { if ($arch eq "armv7") { return matchesUUID($path, $uuid, "armv6"); } else { die "Can't understand the output from otool ($TEST_uuid)"; } }
Run Code Online (Sandbox Code Playgroud)
这里Gregs脚本更改不起作用,
<$ph>在rindex(代码突出显示中迷失了方向.<$ph>在rindex(检查读第一线......所以一帧得到的情况下,失去了它是全成.作为一个"黑客",我只是伪造一个带有adreass的框架1......在atos检查期间被"使用".所以我改变了sub symbolize_frames:
更换:
my $cmd = "$atos -arch $arch -o '$escapedSymbol' @{[ keys %$frames ]} | ";
Run Code Online (Sandbox Code Playgroud)
通过:
my $cmd = "$atos -arch $arch -o '$escapedSymbol' 1 @{[ keys %$frames ]} 2>&1 | ";
Run Code Online (Sandbox Code Playgroud)
更换:
open my($ph),$cmd or die $!;
Run Code Online (Sandbox Code Playgroud)
通过:
open my($ph),$cmd or die $!;
if (rindex(<$ph>, "atos cannot load symbols") != -1 && $arch eq "armv7") {
my $arch = "armv6"; my $cmd = "$atos -arch $arch -o '$escapedSymbol' @{[ keys %$frames ]} 2>&1 | ";
print STDERR "Running $cmd\n" if $opt{v};
open $ph,$cmd or die $!;
}
Run Code Online (Sandbox Code Playgroud)
注意:通过这些更改,脚本运行正常 - "修复"可能不是很优雅,但我不会说流利的perl :) ...
我知道对于 3.0 SDK,他们将 symbolicatecrash 移到了新位置,我必须获取这个新版本才能使符号映射再次工作。
对于 3.0,可以在以下位置找到:/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources
因此,确保您拥有最新版本可能是值得的。我看到我的源函数和 API 函数都有正确的符号映射。
| 归档时间: |
|
| 查看次数: |
7425 次 |
| 最近记录: |