インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックでは、トレースバックの使用に適用されるトレードオフと制約条件について説明します。
traceback オプションを使用して PC の関係付けを自動的に行うと、実行ファイルのサイズが大きくなります。開発者は、個々のアプリケーションについて、実行ファイルのサイズが大きくなっても PC の関係付けを自動的に行うほうが良いのか、それとも PC とマップファイルの関係付けを手作業で行うほうが良いのかを判断しなければなりません。
実行ファイル内に自動的な関係情報を提供するという手法は、アプリケーションの実行中に情報を "動的に" 作成して実行速度を低下させることを避けるために使用されるものです。アプリケーションが致命的なエラーで終了する場合を除き、ランタイム診断コードが呼び出されることはありません。
以下のルーチンはスタックを巡回するために使用されます。
Windows* の場合、imagehlp.dll の Windows* API ルーチン StackWalk( )
Linux* および macOS* の場合、libunwind.so の _Unwind_ForcedUnwind( )、_Unwind_GetIP( )、_Unwind_GetRegionStart( )、および _Unwind_GetGr( ) ルーチン
IA-32 アーキテクチャー環境では、ソフトウェアの呼び出しについて確固たる標準が文書化されていません。したがって、コンパイラー開発者には特に制限がなく、マシンレジスターを任意の方法で使用したり、プロシージャーを任意の方法で結び付けることができます。上記でリストされているスタック巡回ルーチンは、いくつかの自己判断基準に基づいて、コールスタックを巡回する方法を決定します。つまり、一連の呼び出しの中でプログラムがどのように特定の場所に到達したのかを、"最善の推測" を行って判断します。フレームポインターなしオプション -fomit-frame-pointer (Linux* および macOS*) または /Oy (Windows*) を有効にしてコンパイルされた C のコードでは、この "最善の推測" が必ずしも正しく行われるわけではありません。
Fortran と C が混在したコードに対して行われるスタックトレースに不安がある場合、C のコンパイルで -fomit-frame-pointer または /Oy このオプションを無効にすることを検討してください。無効にしないと、トレースバックが正常に動作しない可能性が高くなります。
インライン展開により一部のルーチンは個別のスタックフレームとして認識されなくなるため、トレースバックではインライン展開されたルーチンを表示しません。
プログラムはさまざまな理由で実行に失敗し、予期しない結果を引き起こします。コードが異常な形で実行されて、メモリーが破壊されるということが起こり得ます。例えば、コールスタックをトレースしようとすると、アクセス違反やその他の予期しない結果が発生し、これによりスタックメモリーが破壊されることがあります。スタックトレースのランタイムコードは、ローカル例外フィルターによって保護されています。トレースバックの試みが検出困難な条件が原因で失敗した場合、ランタイムシステムは診断出力メッセージで次のように報告します。
スタックトレースが異常終了しました。
ただし、注意しなければならないのは、メモリーが破壊されていても、スタックトレースが問題の兆候を一切示さない場合があることです。破壊されたメモリーに、そこにスタックがまだあると思い込んで参照し、そこで発見したビット・パターンを使用してメモリーの別の部分を参照したところ、参照先はプログラムの有効なメモリーアドレスだったというようなことが起こりえるのです。 そのようなメモリーアドレスは、以前あったスタックとは全く関係がありません。したがって、スタック巡回が正常に完了したように見えるのに、報告される PC が全く意味をなさない場合、問題を診断する際にスタックトレース出力を無視することを考慮してください。
プログラムが仮想メモリーリソースを使い果たしたために終了した場合でも、スタックトレースのプロセスは無効になります。
スタックトレースは、ランタイムシステムが libunwind.so (Linux* および macOS*) または imagehlp.dll (Windows*) を動的にロードできなかった場合や、必要なルーチンをライブラリーから見つけることができなかった場合にも失敗することがあります。このような場合でも、基本的なランタイム診断メッセージは表示されます。単に、コールスタック情報が入手できないだけです。
次の説明は、Windows* オペレーティング・システムのみを対象としています。
インクリメンタル・リンクが有効になっていると、自動的な PC の関係付けは機能しません。インクリメンタル・リンクを使用すると、コンパイル時に /traceback が指定されていても、自動的な PC の関係付けは常に無効になります。
デフォルトの 16 進 (hex) PC 値は、インクリメンタル・リンクを使用する場合にも出力に表示されます。16 進の PC 値と PC アドレスを含むルーチンを関係付けるには、リンカー・マップ・ファイルを使用する必要があります。しかし、リンク時にマップファイルを要求すると、インクリメンタル・リンクが無効になります。したがって、ランタイムで問題が発生したときに生成される PC 値を活用するには、いずれにせよインクリメンタル・リンクを無効にしなければなりません。
統合開発環境ではコールスタック表示を使用できるため、インクリメンタル・リンクは特に必要ありません。