Символификация crash-дампа iOS

 
 

Допустим вам надо понять что случилось с приложением и у Вас есть крэш-дамп, однако на телефоне стоит iOS 6.1 которую xCode 7.3.1 принципиально знать не хочет и крэш-дампы с этого устройства не забирает. А смотреть надо. Для этого включаем iTunes и синхронизируем устройство, тогда по пути

~/Library/Logs/CrashReporter/MobileDevice/

вы сможете найти крэш-дампы. После этого идем по пути

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Для xCode 7.3 путь меняется

/Applications/Xcode7.3.1.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources

где лежит symbolicatecrash. Берем его и копируем вместе с *.crash файлом и *.ipa файлом (предварительно выключив опцию Strip Debug Symbols During Copy) после этого выполняем нехитрый скрипт

$ export DEVELOPER_DIR=/Applications/xCode6.4/Xcode6.4.app/Contents/Developer
$ ./symbolicatecrash -v superapp_2016-05-11-211803_superphone.crash superapp.ipa

Боремся с The ‘Pods...’ target has transitive dependencies that include static binaries

 
 

Суть проблемы следующаяя

  1. Используем CocoaPods (про Carthage знаю, по некоторым причинам не хочу использовать)
  2. Проект на Swift
  3. Имеет swift’овые зависимости, поэтому use_frameworks!
  4. Имеет старые Objective-C’шные зависимости, в которых есть транзитивные зависимости в которых есть статические либы (something.a, можно в vendored_libraries)

При попытке сделать pod install получаем

The ‘Pods-...’ target has transitive dependencies that include static binaries

Сие подробно дискутируется тут и тут

Внятного решения даже разработчики cocoapods судя по всему пока придумать не могут, но зато предлагают такой вот хак

pre_install do |installer|
    def installer.verify_no_static_framework_transitive_dependencies; end
end

Который просто напросто отключает проверку.

P.S. Правда сий хак не всегда помогает :( и вы можете получить unresolved symbols

P.P.S. Если же вы все-таки хотите transitive static binaries и use_frameworks! то решение существует - необходимо этот transitive static binary обернуть руками в framework а в под зашить vendored_frameworks примерно следующим образом

Нам нужен скрипт создания фреймворка (будем показывать на примере OpenSSL for iPhone)

create-openssl-framework.sh
#!/bin/sh

FWNAME=openssl

if [ ! -d lib ]; then
    echo "Please run build-libssl.sh first!"
    exit 1
fi

if [ -d $FWNAME.framework ]; then
    echo "Removing previous $FWNAME.framework copy"
    rm -rf $FWNAME.framework
fi

if [ "$1" == "dynamic" ]; then
    LIBTOOL_FLAGS="-dynamic -undefined dynamic_lookup"
else
    LIBTOOL_FLAGS="-static"
fi

echo "Creating $FWNAME.framework"
mkdir -p $FWNAME.framework/Headers
libtool -no_warning_for_no_symbols $LIBTOOL_FLAGS -o $FWNAME.framework/$FWNAME -install_name @rpath/$FWNAME.framework/$FWNAME lib/libcrypto.a lib/libssl.a
cp -r include/$FWNAME/* $FWNAME.framework/Headers/
echo "Created $FWNAME.framework"

ВАЖНО: чтобы имелся параметр -install_name … так как без него у вас все соберется, но при запуске будет Library not loaded: Image not found

Сам же podspec файл будет выглядеть примерно следующим образом

{
  "name": "OpenSSL-for-iOS",
  ...
  "prepare_command": "./build-libssl.sh\n./create-openssl-framework.sh\n",
  "ios": {
    "vendored_frameworks": "openssl.framework"
  },
  ...
}

И далее цепляете под себе в Podfile обычным образом

pod 'OpenSSL-for-iOS'

С включенным use_frameworks!

Путь до сборочной директории xCode

 

Тут:

~/Library/Developer/Xcode/DerivedData

GIT для пользователей SVN

 

Записал слайдкаст с краткими замечаниями по GIT’у для пользователей SVN

Создание новых веток в SVN при работе с GIT-SVN

 

Если вам требуется создать ветку в SVN, но при этом вы работаете в GIT, то ситуация сначала может показаться странной, ведь если вы создали ветку от svn/trunk то svn dcommit будет отправлять изменения в svn/trunk а не в вашу ветку. Проблема решается достаточно просто, вот рецепт:

$ git svn branch foo
$ git checkout -b foo -t svn/foo
$ ...
$ git commit
$ git svn dcommit