14

依存関係として別の Xcode プロジェクト (フレームワーク) を含む OSX デスクトップ Xcode プロジェクトがあります。アプリのアーカイブをビルドすると、アプリ用とフレームワーク用の 2 つの dSYM パッケージが生成されます。

アプリから受信したクラッシュをシンボル化すると、アプリ パッケージのシンボルが (ファイル名と行番号と共に) 正しく表示されます。ただし、フレームワークのシンボルはまったくシンボル化されません。フレームワーク名とメモリ アドレスが表示されるだけです。フレームワーク コードを含むスタック トレースの部分を記号化する方法はありますか?

.app パッケージを生成したアーカイブを見ると、フレームワークの dSYM の UUID が、.app の「Frameworks」フォルダーにコピーされるものと一致しません。

アーカイブ ファイルの .app パッケージ内の HCCommon フレームワーク:

/path/to/HipChat.xcarchive $ dwarfdump --uuid Products/Applications/HipChat.app/Contents/Frameworks/HCCommon.framework/HCCommon 
UUID: 84891A9C-19DB-3E16-BE7E-9D4056FFFB97 (x86_64) Products/Applications/HipChat.app/Contents/Frameworks/HCCommon.framework/HCCommon

vs HCCommon フレームワークの dSYM (アーカイブ ファイルの dSYMs ディレクトリ内):

/path/to/HipChat.xcarchive $ dwarfdump --uuid dSYMs/HCCommon.framework.dSYM/Contents/Resources/DWARF/HCCommon 
UUID: 767F2D97-9E0B-3C4D-8337-FDF5A9CA2D81 (x86_64) dSYMs/HCCommon.framework.dSYM/Contents/Resources/DWARF/HCCommon
4

2 に答える 2

5

あなたのビルドが一貫性​​のない dSYM UUID をもたらす理由がわかりません。このような種類のビルドを行うと (いくつかスポット チェックを行いました)、一貫した UUID が得られます。

ただし、既に持っている .dSYM を考慮して、既に受け取ったクラッシュ レポートをどのようにシンボル化できるかについての質問への回答です (現時点では、UUID は一致しますが、それらは同一のコードを参照しているため、機能すると仮定します)。

特定の dsym を強制する必要がある場合は、次のようにするとうまくいくことがわかりました。

atos -arch x86_64 -o <path_to_dsym_within_package> -l <offset_of_framework>

それは確かにそれほどきれいではなく、通常は個々のアドレスをアトスで手動で実行しますが、結果は有効なルーチン/行の組み合わせになります (正しいバージョンに一致すると仮定するなど)。

の後にバイナリ名<path_to_dsym_within_package>foo.framework.dSYM/Contents/Resources/DWARF/foo続きますfoo。 はフレームワークの名前です。私たちにとって、これはあらゆる種類のプラグインでも機能します。

は、クラッシュ ログの<offset_of_framework>is from offset 列です。

0 libsystem_kernel.dylib 0x7fff8e785ce2 0x7fff8e76f000 + 93410
1 libsystem_c.dylib 0x7fff871afa7a 0x7fff8716e000 + 268922
2 CTUtils 0x104e26c62 0x104e17000 + 64610

この場合、最初の 16 進数はアドレス、2 番目の 16 進数は特定のフレームワークの開始オフセット、+ 値はフレームワーク内の 10 進数のオフセットです。

上記のコマンド ラインには 2 番目の番号 (16 進オフセット) が必要で、特定のルーチン/行番号を見つけるには最初の番号が必要です。

最悪のシナリオでは、次を使用dwarfdumpして、常に直接使用します。

dwarfdump <path_to_dSYM> --arch x86_64 --lookup <offset>

<path_to_dSYM>は最上位の ".dSYM" フォルダーへのパス (atos上記のコマンドとは異なります) で、<offset>はモジュール内のオフセットであり、 ほど便利ではありませんatos

開発ツールがインストールされている場合は、PSatosをインストールする必要があります。/usr/bin/atos

于 2013-03-07T13:21:37.373 に答える