トレースバックの使用には,次のトレードオフと制約条件があります。
/traceback オプションを使って自動的な PC の関係付けを行うと,実行形式ファイルの大きさが増えます。開発者は,個々のアプリケーションについて,自動的な PC の関係付けが実行形式ファイルの大きさが増加することに引き合うのか,それとも PC とマップ・ファイルの関係の手作業での調査が許容可能なのかどうかを判断しなくてはなりません。
実行形式ファイル内に自動的な関係情報を提供するというアプローチは,アプリケーションの実行中に情報を「動的」に作成することで,実行速度が低下するのを避けるために使われるものです。アプリケーションが重大なエラーで終了する場合を除いて,実行時の診断コードが呼び出されることはありません。
スタック巡回コードの中核には,imagehlp.dll に含まれる Win32 ルーチン StackWalk() があります。ia32 システム環境では,ソフトウェア呼び出し標準に関する確固としたドキュメントはありません。コンパイラ開発者は,マシン・レジスタを任意の方法で使い,手続を任意の方法でフックアップすることができます。このため,StackWalk() ルーチンは,コール・スタックを巡回する方法に関する決定を,いくつかの自己判断基準の組に基づいて行っています。つまり,プログラムが呼び出しチェーン内の特定の場所にどのように達したのかという点について,「最善の推測」を行うのです。Visual C++ で,フレーム・ポインタ省略オプション (/Oy) を有効にしてコンパイルされた C のコードでは,この「最善の推測」は必ずしも正しくはなりません。
Fortran と C のコードを混在させており,スタック・トレースに関して不安がある場合,C のコンパイルでこのオプションを無効にすることを検討してください (/Oy-)。さもないと,トレースバックが正常に動作しない可能性が高くなります。
増分リンクが有効になっていると,自動的な PC の関係付けは機能しません。増分リンクを使用すると,コンパイル時に /traceback を指定していたとしても,自動的な PC の関係付けは常に無効になります。
増分リンクを使用した場合でも,基本 16 進 PC 値は依然として出力に表示されます。16 進の PC 値を,PC アドレスを含んでいるルーチンと関係付けるためには,リンカー・マップ・ファイルを使用する必要があります。しかし,リンク時にマップ・ファイルを要求すると,増分リンクは無効になります。このため,実行時に問題が生じたときに生成される PC 値を活用するには,いずれにせよ増分リンクを無効にしなくてはなりません。
ビジュアル開発環境では,コール・スタック表示を使用することができるので,増分リンクは問題にはなりません。
プログラムはさまざまな理由で実行に失敗し,予期しない結果を引き起こします。コードが異常な形で実行されて,メモリーが破壊されるということは常に起こりえます。たとえば,コール・スタックをトレースしようと試みると,アクセス違反やその他の望ましくない結果が生じるような形でスタック・メモリーが破壊される可能性があります。スタック・トレースの実行時コードは,局所的な例外フィルタによって保護されています。トレースバックの試みが,検出可能な困難な条件のせいで失敗した場合,実行時システムはそのことを診断出力メッセージに次のように報告します。
Stack trace terminated abnormally
ただし,注意しなければならないのは,メモリーが破壊されていても,スタック・トレースが問題の徴候をいっさい示さないこともあるということです。破壊されたメモリーに,そこにスタックがあると思い込んで参照し,そこに発見したビット・パターンを使ってメモリーの別の部分を参照したところ,参照先はプログラムの有効なメモリー・アドレスだったというようなことが起こりえるのです。そのようなメモリー・アドレスは,かつてのスタックの状態とはまったく関係がありません。したがって,スタック巡回が正常に完了したように見えるのに,報告される PC がまったく意味をなさない場合,問題を診断する際にスタック・トレース出力を無視することを考慮してください。
また,スタック・トレースは,実行時システムが imagehlp.dll を動的にロードできなかった場合や,スタック巡回を行うために必要なルーチンをライブラリー内に見つけることができなかった場合にも失敗することがあります。この場合でも,基本的な実行時診断メッセージは表示されます。単にコール・スタック情報が入手できないだけです。
プログラムが仮想メモリー・リソースを使い尽くしたために終了した場合にも,スタック・トレース・プロセスは無効になります。