AndroidおよびiOS向けの.NET MAUIアプリのリリースビルドにはデバッグ情報が含まれていないため、アプリが報告するC#のスタックトレースにはメソッド名は表示されますが、ソースファイルや行番号は表示されません。そのビルドの対応する.pdbおよび.dllファイルを提供すると、New Relicはブラウザ上でこれらのスタックトレースをシンボル化できます。ブラウザ内でのシンボル化は、処理された例外にのみ適用されます。
このページでは、以下について説明します:
- シンボル化されたC#のスタックトレースとシンボル化されていないC#のスタックトレースの比較
.pdbファイルと.dllファイルを生成する方法と見つける場所- New Relic UIでスタックトレースをシンボル化する方法
- New Relic UIでネイティブiOSのクラッシュを見つける場所と、それらをシンボリケートする方法
- 出荷したすべてのリリースのエラーをシンボル化できるように、これらのファイルを保存する方法
重要
シンボル化は完全にブラウザ内で実行されます。New Relicは、.pdbや.dllファイル、またはシンボル化されたスタックトレースをアップロード、保存、または保持しません。また、結果はエラー間で共有されません:開いたエラーごとに個別にファイルをアップロードし、ページをリロードしたり後で戻ってきたりするたびに再度アップロードします。毎回ファイルが必要になるため、リリースごとにファイルを保管してください。
シンボル化によって追加されるもの
シンボリケーションを行う前は、各フレームのファイルと行番号が表示される場所に<unknown>が表示されます:
<unknown> in NewRelicMaui.MainPage.OnHandledExceptionClicked(Object sender, EventArgs e)()シンボリケーションを行った後は、フレームにソースファイルと行番号が表示されます:
MainPage.xaml.cs line 41 in NewRelicMaui.MainPage.OnHandledExceptionClicked()各フレームの横にあるThread列には、そのフレームが属するクラス(たとえばNewRelicMaui.MainPageなど)が表示されます。
注意
行番号はメソッドが開始する場所(最初のステートメント)であり、例外をスローした正確な行ではありません。New Relicが.NET MAUIアプリから受信するスタックトレースには、メソッド内の行を特定するILオフセットが含まれていません。行番号を使用してソース内のメソッドを見つけ、そのメソッドを調べて原因を探してください。
.NET MAUIシンボルファイルについて
.NET MAUIアプリにはマネージドC#コードとネイティブプラットフォームコードの両方が含まれており、それぞれに独自のデバッグシンボルファイルがあります。各ファイルは、独自のコードからのエラーのみをシンボル化します:
| ファイル | プラットフォーム | シンボル化されるもの | 作成される場所 | New Relicでの使用方法 |
|---|---|---|---|---|
.pdb +.dll(ポータブルPDBとそのアセンブリ) | Android、iOS | アプリおよびクラスライブラリからのC#エラー | bin/Release/<target framework>/、「出力ファイルを見つける」を参照してください。 | このページで説明されているように、ブラウザでアップロードします |
.dSYM | iOS | ネイティブiOSクラッシュ | bin/Release/net10.0-ios/ios-arm64/<YourApp>.app.dSYM | dSYMファイルをアップロードする |
New Relicは、C#エラーをシンボル化するために.pdbおよび.dllファイルのみを使用します。C#エラーにdSYMをアップロードしても、シンボル化されません。ただし、リリースが報告するあらゆる種類のエラーをシンボリケートできるように、リリースごとにそれらをすべて保持してください。
.pdbを生成し、 .dll
リリースビルドのポータブルPDBを有効にする
アプリの.csprojで、Releaseビルドがポータブルデバッグシンボルを生成することを確認してください:
<PropertyGroup Condition="'$(Configuration)' == 'Release'"> <DebugType>portable</DebugType> <DebugSymbols>true</DebugSymbols></PropertyGroup>ビルドにより、アセンブリと同じ場所にポータブルPDBが生成されます。これらはAPK、AAB、またはIPAにパッケージ化されないため、アプリのサイズは増加しません。
コードをシンボル化したいクラスライブラリプロジェクトに、同じ設定を追加してください。
リリースを構築する
$# Android$dotnet publish -f net10.0-android -c Release$
$# iOS$dotnet publish -f net10.0-ios -c Releaseプロジェクトのターゲットフレームワーク(たとえば、net9.0-android)を使用してください。
出力ファイルの検索
スタックトレースに表示される各アセンブリについて、その.dllと一致する.pdbが必要です。これらはビルド出力フォルダー内にあり、プロジェクト名が付けられています:
| プラットフォーム | 場所 |
|---|---|
| Android | bin/Release/net10.0-android/ |
| iOS | bin/Release/net10.0-ios/ios-arm64/ (ios-arm64は物理デバイス用のフォルダーです。iossimulator-arm64は使用しないでください)。 |
たとえば、アプリプロジェクトがNewRelicMauiの場合、NewRelicMaui.dllとNewRelicMaui.pdbが必要です。フレームがどのアセンブリから来ているかを見つけるには、フレーム内のネームスペースを確認します:NewRelicMaui.MainPage.OnHandledExceptionClickedはNewRelicMaui.dllにあります。フレームがMyApp.Coreなどの独自のクラスライブラリから来ている場合は、MyApp.Core.dllとMyApp.Core.pdbを使用してください。
dotnet publish APK、AAB、またはIPAをpublish/サブフォルダーに配置します。.dllファイルと.pdbファイルは、その上のフォルダーの、表に示されている場所にあります。
これらのファイルのコピーは、obj/Release/の下にもあります。互いに一致するように、表内の同じフォルダーから.dllと.pdbを常に一緒にアップロードしてください。
注意
iOSでは、アプリバンドル(NewRelicMaui.app/)またはIPAの内部から.dllを取得しないでください。リリースビルドではそのコピーがトリミングおよびストリップされるため、どの.pdbとも一致しなくなり、バンドルには.pdbが含まれなくなります。
New Relicでスタックトレースをシンボリケートする
エラーを開く
どちらかの場所からC#のエラーを開きます:
- one.newrelic.com > Errors Inbox、次にエラーを選択します。
- one.newrelic.com > Mobile > (select your app) > Handled exceptions、次にエラーを選択します。
Stack traceセクションまでスクロールします。
エラーのappVersionとappBuildを確認してください。これらにより、どのリリースのファイルが必要かがわかります。
.pdb をアップロードし、 .dll
スタックトレースの上にあるNot seeing what you expected?バナーでは、オンデマンドのシンボル化を利用できます。Upload .pdb and .dll filesをクリックし、スタックトレース内のアセンブリの.pdbと.dllの両方を選択します。スタックトレースに複数のアセンブリ(アプリやクラスライブラリなど)のフレームが含まれている場合は、それぞれの.pdbと.dllを選択します。両方のファイルが必要です:.dllはアセンブリとそのメソッドを識別し、.pdbは各メソッドをソースファイルと行にマッピングします。

シンボリケーション前、フレームにはソースファイルと行番号が表示されるはずの場所に<unknown>が表示されます。
選択したファイルがボタンの横に表示されます。両方がリストされていることを確認し(間違っているものは×で削除します)、Symbolicateをクリックします。
結果を確認またはエクスポートする
シンボリケーションが完了すると、バナーがSymbolicated your traceに変わり、解決されたフレーム数(例:Symbolicated 1 of 1 unresolved frame)が報告されます。また、フレームは例外をスローした正確な行ではなく、メソッドの先頭に解決されることも通知されます。

シンボル化後、フレームにはソースファイルとメソッドが開始する行が表示されます。
結果はページが開いている間のみ保持されます。保持するには、Export handled exception detailsをクリックします。エクスポートにはシンボル化されたフレームが含まれるため、チケットに添付したり、チームと共有したりできます。
別のエラーをシンボリケートするには、そのエラーを開いてファイルを再度アップロードしてください。1つのエラーの結果は、他のエラーには引き継がれません。
ネイティブiOSクラッシュのシンボル化
Objective-C、Swift、またはiOSランタイムでのクラッシュなどのネイティブiOSのクラッシュはC#のエラーではないため、.pdbおよび.dllファイルは適用されません。これらのクラッシュでは、代わりにiOSの.dSYMファイルが使用されます。
New Relic UIでネイティブiOSクラッシュを見つけるには、one.newrelic.com > Mobile > (select your app) > Crashesに移動して、クラッシュを選択します。そのビルドのdSYMがNew Relicで利用できない場合、スタックトレースには読み取り可能なメソッド名ではなくマシンコード(メモリアドレス)が表示され、クラッシュレポートには警告が表示されます We were unable to locate your dsym.

dSYMがない場合、ネイティブiOSフレームにはメソッド名ではなくメモリアドレスが表示されます。
修正するには:
- 「.NET MAUIシンボルファイルを理解する」で説明されているように、クラッシュしたビルドの
.dSYMを見つけます。それをクラッシュのappVersionとappBuildに一致させます。 - dSYMファイルのアップロードの手順に従って、New Relicにアップロードしてください。
適切なファイルを見つける
.dll と .pdb のペアは、それを生成したビルドからのスタックトレースに対してのみ正しい結果を提供します:
- リリース:エラーの
appVersionとappBuildを、そのリリース用に保存したファイルと照合してください。 - プラットフォーム:AndroidのエラーにはAndroidファイルを、iOSのエラーにはiOSファイルを使用してください。
- アセンブリ:「出力ファイルを見つける」で説明されているように、スタックフレーム内のネームスペースとアセンブリ名を照合してください。
- 同じビルド:
.pdbを、.dllを生成したビルドと一致させてください。異なるビルドのファイルを混在させないでください。
注意
スタックトレースにはアセンブリIDが含まれていないため、ファイルが別のビルドからのものであるかどうかをNew Relicが常に判断できるわけではありません。アプリの別のバージョンのファイルでも結果が生成される場合がありますが、コードが変更されている場合は、行番号が誤った場所を指す可能性があります。メソッドの上にコメント行を1行追加しただけでも、その行番号は移動します。結果を利用する前に、ファイルがエラーのappVersionおよびappBuildと一致していることを確認してください。
ベストプラクティス:すべてのリリースでシンボルを保存する
New Relicは.pdbファイルと.dllファイルを保持しないため、ご自身で保存する必要があります。エラーが発生した後ではなく、各リリースをビルドする際に保存してください。
- 配布するすべてのビルドのファイルを保管してください。これには、AndroidとiOSの両方の内部ビルド、ベータ版、ストアビルドが含まれます。
- iOSのdSYMを含め、すべての種類のシンボルファイルを保持してください。「.NET MAUIシンボルファイルを理解する」を参照してください。
- メインアプリのアセンブリだけでなく、独自のクラスライブラリを含めてください。
- エラーの適切なファイルを見つけられるように、アプリが報告する
appVersionおよびappBuild属性と一致させて、プラットフォーム、バージョン、ビルド番号でラベル付けしてください。 - そのバージョンが使用されている間は、それらを保持してください。ユーザーは何ヶ月も古いバージョンを使い続けることがよくあります。
- アクセスを制限します。PDBにより、ソースファイルのパスとコード構造が明らかになります。ソースコードと同じアクセス制御で保存してください。
どこに保存するかは任意です。たとえば、CIシステムのビルドアーティファクト、ストレージバケット、アーティファクトリポジトリなどです。CIビルドアーティファクトを使用する場合は、CIシステムがそれらを保持する期間を確認してください。多くのシステムでは、一定時間後に自動的に削除されるためです。
注意
再ビルドで同一のファイルが生成されるのは、ソースコード、依存関係、SDKバージョン、およびビルド設定がすべて完全に同じである場合のみです。実際にリリースしたビルドのファイルを保存してください。それらを再作成できるとは限らないため、ご注意ください。