Если вы сталкиваетесь с ситуацией, когда при запуске символьного сбоя символизируются только ваши собственные библиотеки, но системные символы не символизируются, а у вас установлен iPhone 3.0+ SDK, скорее всего, проблема в том, что вы используете формат отчета. символизация является более старым форматом. Одним из полей заголовка в отчете о сбое является «Версия отчета», это версия вашего отчета о сбое. Самая последняя версия (на момент написания этой статьи iPhone OS 3.2.1) - «104». Тем не менее, symbolicatecrash обрабатывает версии 102 и 103 также. Версия 104 представила новую архитектуру чипа (armv7), и двоичные образы имеют возможность указать архитектуру чипа, которая используется. Версии 102 и 103 отчета о сбое не указывают архитектуру чипа для использования. В самой последней версии symbolicatecrash предполагается использовать armv6 для версий 102 и 103 отчета. Это, вероятно, неправильно.
Необходимо написать символическую ошибку, чтобы она была более совместимой со старыми форматами отчетов. В общем, UUID для двоичных образов - это действительно все, что вам нужно для правильного соответствия символов системной библиотеки для правильной версии ОС, а также архитектуры - архитектура, вероятно, избыточна. Однако для того, чтобы это происходило правильно, необходимо изменить сценарий сбоя символьного кода, чтобы в дополнение к итерации всех версий системной библиотеки, установленных на хост-компьютере, для поиска правильной библиотеки, он также должен был выполнять итерацию по всем архитектура чипов, а также. К счастью, это довольно легко сделать.
Для этого я внес следующие изменения:
в подпрограмме 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 в разделе двоичного образа в отчете о сбое (и если в следующем 2010 году iPhone будет иметь другую архитектуру микросхем, которую следует добавить к этому, если еще условие).
Что касается следующего изменения, то фрагмент кода для поиска UUID хрупок. Если otool не возвращает что-то, что может понять символьная ошибка, символическая ошибка завершится. В случае, когда вы тестируете UUID архитектуры, которая не распознается хост-машиной, otool ничего не возвращает, и символическая ошибка умирает. Вы должны сделать символьный сбой более мягким, просто проигнорировав результат 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).