iPhone SDK 3.0 и символическая ошибка не ладят? - PullRequest
12 голосов
/ 30 июля 2009

* ОБНОВЛЕНИЕ * Я переустановил с Snow Leopard, чистая установка. Полностью стерла мою существующую установку Leopard. Та же проблема сохраняется.

Я пробовал несколько версий symbolicatecrash для разрешения символов в моих отчетах о сбоях. От версии, предоставленной Apple, до версии Alan's Quatermain, размещенной на GitHub, и, наконец, http://openradar.appspot.com/6438643.

По любой причине лучшие результаты, которые я могу получить, - это разрешение символов в моих собственных библиотеках. Обычно этих данных достаточно, чтобы указать мне верное направление, а иногда - нет. С 2.x у меня не было проблем с получением символов для моего кода + Apple предоставила библиотеки внутри трассировки стека в каждом потоке.

Скорее всего, проблема с моей средой здесь, я совсем не сомневаюсь в работе, которую проделали Apple или Алан. Да, я уверен, что 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

Вот пример отчета о сбое после его запуска через 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)  

Ответы [ 8 ]

8 голосов
/ 09 июля 2010

Предложения Грега, не работали для меня, но помогли указать правильное направление заставить логи plcrashreporter (версия репортера 103) снова символизировать с помощью sdk 4.0.

Кстати: эта проблема у вас наверняка возникнет с отчетами, созданными на более новых устройствах (armv7) потому что символика предполагает, что отчеты версии 103 - armv6.

Так вот что я сделал ...

1)

сделать копию из новейшего скрипта symbolicatecrash (SDK 4.0) для внесенных вами изменений. Примечание: в зависимости от используемого вами редактора, вам может потребоваться установить исполняемый бит после редактирования. chmod 755 symbolicatecrash


2) проблема: поиск символов - НЕТ МАТЧИ

это потому, что по умолчанию установлено armv6.

Разрешение: в sub parse_images установить архитектуру по умолчанию my $default_arch = 'armv7';


3) проблема: «Использование неинициализированного значения $ bundle ...»

Разрешение: (взломать: снятие некоторых ограничений, которые не работают на 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) выпуск: "Атос не может найти символы"

здесь изменения скрипта Грегса не сработали,

  • похоже, что <$ph> в rindex( потерялись при выделении кода.
  • "atos не может загружать символы" не передавались в скрипт - поэтому проверка не сработала
  • проверка <$ph> в rindex( читает первую строку ... поэтому один кадр теряется в случае успеха. В качестве «хака» я просто подделал кадр с 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 $!;
}

Примечание: с этими изменениями скрипт работает нормально для меня - "исправления", вероятно, не очень элегантны, но я не бегло говорю на Perl :) ...

4 голосов
/ 15 января 2010

Если вы сталкиваетесь с ситуацией, когда при запуске символьного сбоя символизируются только ваши собственные библиотеки, но системные символы не символизируются, а у вас установлен 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).

2 голосов
/ 10 января 2010

Я столкнулся с точно такой же проблемой и смог ее исправить, изменив скрипт symbolicatecrash. Проблема для меня заключалась в том, что и «otool», «atos» и «size» не работали хорошо с модулями, скомпилированными для armv7. Существуют версии этих инструментов, которые хорошо работают с такими модулями, которые можно найти по адресу /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin. Для otool сценарий symbolicatecrash, найденный по адресу /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 $!;

, кажется, заставляет его работать.

1 голос
/ 14 января 2010

одна вещь, чтобы проверить. если вы знаете файл dsym, который вы хотите обозначить символом, щелкните правой кнопкой мыши файл dsym и выберите «Получить информацию». В разделе дополнительной информации UUID для файла dsym. Чтобы символика работала, UUID для вашего приложения (заключенный в угловые скобки в разделе двоичных изображений в журнале сбоев) должен совпадать с UUID файла DSYM.

Я обнаружил проблему при использовании PLCrashReporter, когда UUID в журнале сбоев не совпадает с UUID сгенерированного файла dsym, что приводит к ошибке символизации.

1 голос
/ 13 января 2010

У меня возникла точно такая же проблема - отображались символы для системных модулей, но не из моего приложения. Оказывается, это потому, что мои файлы .dSym не могли быть найдены в центре внимания, поскольку я «скрыл» все продукты сборки, указав в настройках, что все файлы сборки находятся в каталоге «.xcode-build». Изменение этого параметра на «xcode-build» решило проблему!

1 голос
/ 05 августа 2009

Я знаю, что для 3.0 SDK они переместили symbolicatecrash в новое место, и мне пришлось получить эту новую версию, чтобы заставить отображения символов работать снова.

Для 3.0 он находится по адресу: /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

Так что, возможно, стоит убедиться, что у вас самая последняя версия. Я вижу правильное сопоставление символов для моих функций источника и API.

0 голосов
/ 29 июня 2010

У меня было много запусков с symbolicatecrash, последнее после обновления до SDK 4. Несмотря на сборку для архитектур armv6 и amrv7, otool и atos choke на двоичном образе моего приложения. Я сделал следующие изменения, и все снова работает. Надеюсь, это поможет.

ОТ (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 ]} | ";</p> <pre><code>print STDERR "Running $cmd\n" if $opt{v}; open $ph,$cmd or die $!;

}

И

ОТ (суб совпадения UUID):

} 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)"; } }

0 голосов
/ 25 ноября 2009

Редактировать символическую ошибку. Перейдите к строке 506 и измените это:

    ARM      =>  "armv6",

к этому:

    ARM      =>  "armv7",
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...