Sun Visual WorkShop C++ の概要

第 4 章 デバッグとチューニング

アプリケーションプログラムのパフォーマンスは、さまざまな要因によって決まります。数ある要因の中でも開発者にとって特に重要なのは、プログラムが望ましい設計になっているかどうか -- 効率的で信頼性が高く、高速処理が可能な設計であるかどうか -- ということです。こうした望ましい設計に役立つのが、Sun Visual WorkShop C++ のデバッグツールやパフォーマンスチューニングツールです。各ツールを十分に活用して、ソースコードの解析、問題点の検出と特定、アプリケーションの微調整などを行い、最高のパフォーマンスを実現させてください。

デバッグ

デバッグ作業では、Sun Visual WorkShop に組み込まれている 2 つのデバッグツールのうちどちらかを使用します。デバッグツールには、dbx とデバッガがあり、互いに密接な関係を持っています。

dbx の使用 - コマンド行デバッグ

dbx は、ソースレベルの対話型コマンド行ツールです。dbx では、プログラムの実行制御、停止したプログラムの状態の検査、パフォーマンスデータの収集など、プログラムの動的実行を全面的に制御することができます。

標準の dbx に組み込まれているマルチスレッド開発機能を利用して、認識されているスレッドと、その現在の状態、基底関数、現在の関数をすべて特定することができます。また、スレッドのスタックトレースを調べることもできます。プログラムが正しく実行されていることを確認したい場合は、スレッド間をナビゲートして、ステップごとのデバッグや、スレッド全体のデバッグを行います。プログラムの実行は、その後いつでも再開できます。


注 -

dbx を使用して、マルチスレッド化されたアプリケーションをデバッグする場合は、リンク時に -lthread オプションを指定します。


デバッガの使用 - GUI によるデバッグ

dbx よりもグラフィカルインタフェースの方が扱いやすい場合は、デバッガ (Sun WorkShop の「デバッグ」 ウィンドウ) を使用します。dbx は、プログラムの実行中にプログラムの動作に関する詳細情報を取得し、通信プロトコルを使って、この情報をデバッガに渡します。デバッガでは、GUI のボタンをクリックするだけで、ほとんどのコマンドを実行することができるため、デバッグを簡単に行うことができます。

また、デバッガからエディタを開いてプログラムを編集できるため、ツールを変更する手間が省けます。

修正継続機能

デバッガの修正継続 (Fix and Continue) 機能を利用すると、ソースコードを変更した後、ファイルを再度コンパイルしてプログラムの実行を継続することができます。このとき、デバッガを終了させる必要はありません。また、プログラムのリンクや読み込みを再度行う必要もありません。

実行時検査

実行時検査 (Runtime Checking、RTC) によって、検出の難しいメモリーアクセスエラーやメモリーリークを開発段階で検出することができます。この検査は、シングルスレッドのアプリケーションでもマルチスレッドのアプリケーションでも有効です。実行時検査によって、アプリケーション内の実行時エラーが自動検出されると、デバッガがプログラムの実行に割り込み、関連するソースコードを表示します。ここで、検出されたバグを修正することができます。

チューニング

デバッグが完了したら、標本アナライザを使って、プログラムのパフォーマンスを評価し、メモリーを割り当てるなどの調整作業を行います。標本アナライザでアプリケーションのパフォーマンスプロファイルを測定すると、結果がグラフィック表示されます。この結果を元に、パフォーマンスを向上させるための方策を立ててください。標本アナライザは、特殊なデータ収集手法によって、コンパイルされたプログラムをすべて解析することができます。したがって、コンパイルとリンクの作業を繰り返す必要がありません。

さまざまなパフォーマンスデータの解析

次に、標本アナライザで解析することができるパフォーマンスデータを紹介します。

解析の制御

デバッガは、標本アナライザによるデータ収集処理の前段階として機能します。プログラムの実行中に、dbx またはデバッガから標本コレクタのウィンドウを開いて、データ収集処理を制御することができます。ブレークポイント間のデータだけを収集したり、プログラムの特定の部分のデータだけを収集することもできます。データ収集プログラムの実行のことを「実験」、コレクタが作成したデータファイルのことを「実験記録」と呼びます。実験記録を読み込んだら、標本アナライザで、パフォーマンスの問題点を特定します。


注 -

パフォーマンスのチューニングと実行時検査は、互いに排他的な処理です。同時には実行しないでください。同時に実行すると、チューニングに関する情報に悪影響が出る場合があります。


問題点の抽出

パフォーマンス上の問題が発生している部分に的を絞って、プログラムの動作を仮定したテストを行います。パフォーマンスが向上するようにプログラムを再構築したい場合は、標本アナライザでマップファイルを生成します。このマップファイルには、プログラムのアドレス空間に関数を読み込む順序が記述されています。場合によっては、マップファイルの指示に従って、リンカーが関数をメモリーに再マッピングすることもあります。この場合、パフォーマンスは自動的に改善されます。

呼び出しモジュールの検索

パフォーマンス解析ツールでは、コマンドのタイミングの解析からプログラムの文単位の解析まで、広範囲に及ぶ解析処理を行うことができます。フラットプロファイルはパフォーマンスの改善に役立つ重要なデータを提供しますが、そのデータだけでは、改善の必要がある個所を正確に特定できないことがあります。この場合は、コールグラフプロファイルを使用して、より詳しい解析データを取得します。このデータから、呼び出し元のモジュールと、呼び出し先のモジュールを特定することができます。

多重処理とマルチスレッド

多重処理 (MP) は、共用メモリーを持つ密結合型マルチ CPU システムをサポートするハードウェア技術です。マルチ CPU システムを利用すれば、アプリケーションのパフォーマンスをさらに向上させることができます。

マルチスレッド (MT) は、シングルプロセッサとマルチプロセッサの両システムで並列アプリケーションの開発を可能にするソフトウェア技術です。独立した各実行スレッドは、マルチプロセッサシステムの複数の CPU 上でスケジュールされますが、メモリーやファイルなどの資源は共有しています。こうした実行スレッドを使用すると、ひとつのアプリケーションの実行を並列処理で行えるようになります。スレッドは、オペレーティングシステムが提供する相互排他ロック (mutex ロック) を使用して資源を共有し、同期をとり、相互通信を行います。多重処理とマルチスレッドを組み合わせて使用すると、アプリケーションのパフォーマンスの向上を実感できる、拡張性に富んだソリューションが得られます。

並列性の活用

アプリケーションの並列処理を行うと、新しい多重処理システムとマルチスレッド化されたオペレーティング環境によって、パフォーマンス、応答性、柔軟性を向上させることができます。スレッド化には次の効果があります。

マルチスレッド開発ツールによるエラー検出の高速化

マルチスレッド開発ツールを使用すると、C++ コンパイラ (および多重処理 C コンパイラ) の機能を拡張し、多重処理を最適化することができます。多重処理とマルチスレッド開発のためのツールセットには、Sun WorkShop デバッガと dbx のマルチスレッド化拡張機能の他に、「ロック lint」、「ループツール」という 2 つの補助ツールが含まれています。

ロック lint による矛盾したロックの検索

相互排他ロック (mutex ロック) と読み取り・書き込みロックの使用状況を静的に解析するには、ロック lint を使用します。このツールで、矛盾したロックの使用を検索すると、データの競合とデッドロックの一般的な原因を検出することができます。

ループ情報の解析

多重処理 C++ コンパイラや C コンパイラと併せて、パフォーマンス解析ツール -- ループツールとループレポート -- を利用することができます。コンパイラは、ループが問題なく並列化でき、この処理が効果的であると判断すると、自動的に並列化処理を行います。ループツールには、次の機能があります。

ループレポートのコマンド行ツールを使用すると、全ループの実行時一覧表が作成されます。この一覧表には、ループが並列化されなかった理由を示すコンパイラヒントも含まれています。