Подтвердить что ты не робот

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)  
4b9b3361

Ответ 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)"; } }