IPhone SDK 3.0 и symbolicatecrash не ладят?
* ОБНОВЛЕНИЕ *
Я переустановил Snow Leopard, чистую установку. Полностью уничтожил мою существующую установку Leopard. Такая же проблема сохраняется.
Я пробовал количество версий symbolicatecrash для разрешения символов в отчетах о сбоях. Из версии, предоставленной Apple, к версии Alan Quatermain, размещенной на GitHub, и, наконец, от http://openradar.appspot.com/6438643.
По какой-то причине наилучшие результаты, которые я могу получить, это для того, чтобы символы в моих собственных библиотеках могли быть решены. Обычно это достаточно данных, чтобы указать мне в правильном направлении - в других случаях это не так. С 2.x у меня не было проблем с получением символов для моего кода + Apple, предоставленных библиотеками из трасс стека в каждом потоке.
Скорее всего, проблема с моей средой здесь, я вовсе не сомневаюсь в том, что сделали Apple или Алан. Да, я уверен, что dSYM, который я скрыл, тот же самый, который генерирует отчет о сбое.
Хотя "Foo" - это я, и получение символов от него замечательно, мне нужно увидеть символы из других функций в стеке, чтобы действительно понять мои отчеты.
Примечание. Для устройств, работающих с приложением на iPhone OS 2.2.1, у меня нет проблем с получением всех символов. Это проблема с iPhone OS 3.0.
Кроме того, при запуске symcricatecrash в режиме verbose здесь несколько вещей, которые меня поразили как неправильные:
- 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
Вот пример отчета о сбое после его запуска через 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)
Ответы
Ответ 1
Предложения Грега, не работали для меня, но помогли указать правильное направление
для получения журналов plcrashreporter (репортер версии 103), чтобы снова символизировать sdk 4.0.
BTW: это проблема, с которой вы обязательно столкнетесь с отчетами, созданными на более новых устройствах (armv7)
потому что символ предполагает, что сообщения версии 103 являются armv6.
Так вот что я сделал...
1)
создайте копию из новейшего символа crash script (sdk 4.0) для внесенных изменений.
Примечание: в зависимости от использования редактора вы можете установить исполняемый бит после редактирования.
chmod 755 symbolicatecrash
2) проблема: поиск символов - NO MATCH
это потому, что по умолчанию установлено значение armv6.
Разрешение: в sub parse_images
установить архитектуру по умолчанию my $default_arch = 'armv7';
3) выпуск: "Использование неинициализированного значения $bundle..."
Разрешение: (hack: удаление некоторых ограничений, которые, похоже, не работают в 103 отчетах)
заменить:
$app = $bundlename if (!defined $app && defined $image{plus} && length $image{plus});
по:
$app = $bundlename if (!defined $app);
4) проблема: "невозможно понять вывод из otool"
Разрешение: Грег исправить для sub matchesUUID
.
заменить:
} else { die "Can't understand the output from otool ($TEST_uuid)"; }
по:
} else { if ($arch eq "armv7") { return matchesUUID($path, $uuid, "armv6"); } else { die "Can't understand the output from otool ($TEST_uuid)"; } }
5): "atos не может найти символы"
здесь изменения Gregs script не работают,
- кажется, что
<$ph>
в rindex(
потеряно в подсветке кода.
- "atos не может загружать символы" не был передан в script - поэтому проверка не будет работать
-
<$ph>
in rindex(
check считывает первую строку... так что один кадр теряется, если он был успешным.
В качестве "взлома" я просто подделал рамку с adreass 1
... которая "используется" во время проверки atos.
Итак, это то, что я изменил в sub symbolize_frames
:
заменить:
my $cmd = "$atos -arch $arch -o '$escapedSymbol' @{[ keys %$frames ]} | ";
по:
my $cmd = "$atos -arch $arch -o '$escapedSymbol' 1 @{[ keys %$frames ]} 2>&1 | ";
заменить:
open my($ph),$cmd or die $!;
по:
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 $!;
}
Примечание: при этом изменения script выполняются отлично для меня - "исправления", вероятно, не очень элегантные, но я не уверен в Perl:)...
Ответ 2
Если вы столкнулись с ситуацией, когда при запуске символьного сбоя символизируются только ваши собственные библиотеки, но системные библиотеки не символизируются, а у вас есть 3.0+ iPhone SDK, скорее всего, проблема заключается в том, что формат отчета, который вы Символизм - более старый формат. Одним из полей заголовка в отчете о сбое является "Версия отчета", это версия отчета о сбоях. Самая последняя версия (на момент написания iPhone OS 3.2.1) - "104". Тем не менее, symbolicatecrash обрабатывает версии 102 и 103. Версия 104 представила новую новую архитектуру чипа (armv7), а бинарные изображения имеют возможность указывать используемую архитектуру чипа. В версиях 102 и 103 отчета о сбое не указывается используемая архитектура микросхемы. Самая последняя версия symbolicatecrash предполагает использование armv6 для версий 102 и 103 отчета. Вероятно, это неверно.
Символьная авария должна быть написана для большей совместимости со старыми форматами отчетов. В общем, UUID для двоичных изображений - это все, что вам нужно, чтобы правильно сопоставить символы системной библиотеки для правильной версии ОС, а также архитектуры - архитектура, вероятно, избыточна. Однако для того, чтобы это произошло правильно, необходимо изменить символический сбой script, чтобы в дополнение к итерированию всех версий системной библиотеки, установленных на главной машине, чтобы найти нужную библиотеку, также необходимо выполнить итерацию все архитектуры чипов. Это, к счастью, довольно легко изменить.
Чтобы справиться с этим, я сделал следующие изменения:
в подпрограмме getSymbolPathFor:
if ( defined($temp_path) && matchesUUID($temp_path, $uuid, $arch) ) {
$out_path = $temp_path;
@out_path_arr = {};
} else {
undef $temp_path;
print STDERR "-- NO MATCH\n" if $opt{v};
}
измените на:
if ( defined($temp_path) && matchesUUID($temp_path, $uuid, $arch) ) {
$out_path = $temp_path;
@out_path_arr = {};
} else {
if ( defined($temp_path) && matchesUUID($temp_path, $uuid, 'armv7') ) {
$out_path = $temp_path;
@out_path_arr = {};
} else {
undef $temp_path;
print STDERR "-- NO MATCH\n" if $opt{v};
}
}
Это проверит различные архитектуры чипов UUID на хост-системе, чтобы найти совпадение с UUID в разделе двоичного изображения в отчете о сбое (и если предстоящий iPhone 2010 имеет другую архитектуру микросхемы, которая должна быть добавлена к этому, если -ее условие).
Для следующего изменения фрагмент кода поиска UUID является хрупким. Если otool не возвращает то, что может распознать symbolicatecrash, symbolicatecrash выйдет. В случае, когда вы тестируете UUID архитектуры, которая не распознается хост-машиной, otool ничего не вернет, а символика crash умирает. Вам нужно сделать символический сбой немного более мягким, просто проигнорируйте результат otool, чтобы он мог перейти к следующей архитектуре, которую вы проверяете.
Измените подпрограмму matchUUID:
if ( $test eq $uuid ) {
## See that it isn't stripped. Even fully stripped apps have one symbol, so ensure that there is more than one.
my ($nlocalsym) = $TEST_uuid =~ /nlocalsym\s+([0-9A-Fa-f]+)/;
my ($nextdefsym) = $TEST_uuid =~ /nextdefsym\s+([0-9A-Fa-f]+)/;
my $totalsym = $nextdefsym + $nlocalsym;
print STDERR "\nNumber of symbols in $path: $nextdefsym + $nlocalsym = $totalsym\n" if $opt{v};
return 1 if ( $totalsym > 1 );
print STDERR "## $path appears to be stripped, skipping.\n" if $opt{v};
} else {
print STDERR "Given UUID $uuid for '$path' is really UUID $test\n" if $opt{v};
}
} else {
die "Can't understand the output from otool ($TEST_uuid)";
}
Для чего-то более снисходительного:
if ( $test eq $uuid ) {
## See that it isn't stripped. Even fully stripped apps have one symbol, so ensure that there is more than one.
my ($nlocalsym) = $TEST_uuid =~ /nlocalsym\s+([0-9A-Fa-f]+)/;
my ($nextdefsym) = $TEST_uuid =~ /nextdefsym\s+([0-9A-Fa-f]+)/;
my $totalsym = $nextdefsym + $nlocalsym;
print STDERR "\nNumber of symbols in $path: $nextdefsym + $nlocalsym = $totalsym\n" if $opt{v};
return 1 if ( $totalsym > 1 );
print STDERR "## $path appears to be stripped, skipping.\n" if $opt{v};
} else {
print STDERR "Given UUID $uuid for '$path' is really UUID $test\n" if $opt{v};
}
} else {
#die "Can't understand the output from otool ($TEST_uuid)";
print "Can't understand the output from otool ($TEST_uuid)";
}
После того, как я сделал эти изменения, я смог увидеть, что системные объекты получают символически правильно (а также мой собственный код), когда я использую отчеты об ошибках 102 и 103 с текущим iPhone SDK (3.1.2).
Ответ 3
Я испытал ту же самую проблему и смог ее исправить, изменив символический crash script. Проблема для меня заключалась в том, что как "otool", "atos", так и "size" не очень хорошо сочетались с модулями, скомпилированными для armv7. Существуют версии этих инструментов, которые хорошо работают с такими модулями, которые можно найти в /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin. Для otool символика crash script, найденная в /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources, уже использует механизм для поиска соответствующей версии:
# Find otool from the latest iphoneos
my $otool = `xcrun -sdk iphoneos -find otool`;
chomp($otool);
my $atos = `xcrun -sdk iphoneos -find atos`;
chomp($atos);
Однако "размер" используется напрямую:
if (-e '/usr/bin/size') {
open my($ph),"-|",'size','-m','-l','-x',$symbol or die $!;
Изменение этого фрагмента кода к уродливому:
if (-e '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/size') {
open my($ph),"-|",'/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/size','-m','-l','-x',$symbol or die $!;
похоже, заставляет его работать.
Ответ 4
Я знаю, что для SDK 3.0 они переместили symbolicatecrash в новое место, и мне пришлось получить эту новую версию, чтобы снова отобразить сопоставления символов.
Для 3.0 он находится по адресу:
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources
Так что, возможно, стоит убедиться, что у вас самая последняя версия. Я вижу правильное отображение символов для моих исходных и API-функций.
Ответ 5
Я испытывал точно такую же проблему - отображались символы для системных модулей, но не из моего приложения. Оказывается, это потому, что мои .dSym файлы не могли быть найдены прожектором, поскольку я "скрывал" все продукты сборки, указав в настройках, что все файлы сборки входят в каталог ".xcode-build". Изменение этого параметра на "xcode-build" устранило проблему!
Ответ 6
одно, чтобы проверить. если вы знаете файл dsym, с которым хотите сопоставить, затем щелкните правой кнопкой мыши на файле dsym и выберите "Получить информацию". В разделе дополнительной информации содержится UUID для файла dsym. Для того, чтобы символика работала, UUID для вашего приложения (заключенный в угловые скобки в разделе двоичных изображений журнала сбоев), должен соответствовать UUID файла DSYM.
Я нашел проблему в моем использовании PLCrashReporter, где UUID в журнале сбоев не соответствовал UUID сгенерированного файла dsym, что привело к сбою символа.
Ответ 7
Изменить символическую краху. Перейдите к строке 506 и измените это:
ARM => "armv6",
:
ARM => "armv7",
Ответ 8
У меня было множество runins с символикой crash, последняя с момента обновления до SDK 4. Несмотря на то, что я построил архитектуру armv6 и amrv7, otool и atos задушили бинарное изображение приложения. Я сделал следующие изменения, и все работает снова. Надеюсь, это поможет.
FROM (sub symbolize_frames):
open my($ph),$cmd or die $!;
TO:
open my($ph),$cmd or die $!;
if (rindex(, "atos cannot load symbols" != -1 && $arch eq "armv7")) {
$arch = "armv6";
my $cmd = "$atos -arch $arch -o '$escapedSymbol' @{[ keys %$frames ]} | ";
print STDERR "Running $cmd\n" if $opt{v};
open $ph,$cmd or die $!;
}код >
и
FROM (sub matchesUUID):
} else {
die "Can't understand the output from otool ($TEST_uuid)";
}
TO:
} else {
if ($arch eq "armv7") {
return matchesUUID($path, $uuid, "armv6");
} else {
die "Can't understand the output from otool ($TEST_uuid)";
}
}