5.4. Variable Tracking at Assignments

Variable Tracking at Assignments (VTA) は、最適化時の変数追跡を改善するために使用される GCC に組み込まれた新規のインフラストラクチャーです。これにより、GCC は GDB、SystemTap および他のデバッグツール用の詳細で、意味のある役に立つデバッグ情報を生成できます。
GCC が最適化を有効にしてコードをコンパイルする場合、変数の名前が変更されるか、変数が移動するか、またはすべて一緒に削除されます。そのため、最適化されたコンパイルにより、デバッガーは一部の変数が <optimized out> されていることを報告します。 VTA を有効にすると、最適化されたコードには内部で注釈が付けられ、変数が移動されているか、または削除されるかどうかにかかわらず、それぞれの変数の値を透過的に追跡するために最適化が渡されることを確認できます。この結果、最適化された (gcc -O2 -g でビルドされた) コードの場合でもより多くのパラメーターと変数値を利用できるようになります。さらに、表示される <optimized out> メッセージがより少なくなります。
VTA の利点は、アプリケーションをインライン関数でデバッグする場合にさらに明らかになります。VTA を使用しないと、最適化によりインライン関数の一部の引数が完全に削除され、デバッガーがその値を検査できなくなる可能性があります。VTA を使用すると最適化が実行され、さらに欠落した引数についての適切なデバッグ情報が生成されます。
VTA は、コードを最適化でコンパイルし、デバッグ情報を有効にする (つまり、gcc -O -g またはより一般的には gcc -O2 -g) 場合にデフォルトで有効になります。このビルド時に VTA を無効にするには、-fno-var-tracking-assignments を追加します。さらに、VTA インフラストラクチャーには、新規の gcc オプション -fcompare-debug が含まれます。このオプションは、デバッグ情報を使った場合とデバッグ情報を使わなかった場合の GCC でコンパイルされたコードをテストします。テストはこれら 2 つのバイナリーが同一である場合にパスします。このテストにより、実行可能コードがいずれのデバッグオプションによっても影響されず、かつデバッグコードには隠されたバグがないことを確認できます。-fcompare-debug はコンパイル時に多くのコストを追加することに注意してください。このオプションについての詳細は、man gcc を参照してください。
VTA のインフラストラクチャーおよび開発についての詳細は、以下のリンクから閲覧可能な 『A Plan to Fix Local Variable Debug Information in GCC』 を参照してください。
このホワイトペーパーのスライド資料のバージョンは、http://people.redhat.com/aoliva/papers/vta/slides.pdf にあります。