このブログでは、標準のIDE機能では提供していない高度なコードエディタのマークアップ、コールスタックUI、マルチスレッドデバッグツールを備えた新しいIDEのプラグインである高機能な「並列デバッガ」の概要について詳しく解説いたします。
「Parnassus Parallel Debugger」は、以前「アップデートサブスクリプションの特典–2020年9月版ハイライト」で紹介していた「並列デバッガ」のことで、かねてから定評のあるRAD Studio向けのIDEプラグインである「BookmarksおよびNavigator」を制作しているParnassus社によって提供されているRAD Studioの新しいプラグインです。
「Parnassus Parallel Debugger」は、以下の条件で無償でのご利用が可能です。
- アップデートサブスクリプションが有効なユーザー
- Delphi または C++Builder 10.4.1以降をインストール
このプラグインをインストールするには、GetItパッケージマネージャを開いて、検索ボックスから”debug”というキーワードで検索すると”Parnassus Parallel Debugger”が見つかりますので、これを選択してインストールすることができます。
「Parnassus Parallel Debugger」とは?
- マルチスレッドアプリケーションをデバッグするためのツール
- …そして、従来のシングルスレッドアプリのデバッグにも役立ちます!
特に・・今までマルチスレッドのデバッグに課題を抱えていた開発者は必見です!!
では、もっと詳しく説明していきたいと思います。
Table of Contents
課題
アプリケーション上で複数のスレッドが動作している場合、スレッドとの相互作用をデバッグしたいと感じた事も多いのではないでしょうか。
従来のIDEのデバッガでは、 デバッグしているアプリケーションのスレッドビューを見ると、 実行している複数のスレッド一覧が表示されますが、アプリケーションはあたかも1つのスレッドとしか対話していないように扱われています。つまりIDEメニューの実行/一時停止/ステップなどの制御を行うボタンは、各スレッドごとではなくプロセス全体を対象としているので、複数のスレッドの中からコールスタックを1つだけ表示している状態にすぎません。そのためアプリケーションのデバッグが必要な開発者は、以下のような疑問を持つことになります。
- 複数のスレッドが同じコードで同時に実行されているかどうかを確認するにはどうすればよいのか?
- すべてのスレッドが一度に何をしているかを確認するにはどうすればよいのか?
- 1つのスレッドだけでメソッドをステップスルーするにはどうすればよいのか?(例えば、他のスレッドを実行したくない、望まないコードを実行したり、そしてブレークポイントに到達せずに、1つのスレッドをデバッグするにはどうすればよいのか?)
- 各スレッドはどのくらいのCPUを使用していますか? それらは本当に効率的なのか?
このような疑問に対して、きっと以下のような要望もあるでしょう。
- コールスタック内のすべてのメソッドがコードエディタでハイライトされ、もっと見やすくなればいいのに・・。
- ブレークポイントを特定のスレッドにのみ適用することが、もっと簡単にできればいいのに・・。
- 現在のコード行を表示するエディタのマークアップが、もっと見やすくなればいいのに・・。
- プロセスを一時停止する際、CPUビューではなく、自分のソースだけを表示してくれたらいいのに・・。
これらの要望は、この新しいプラグインによってカバーすることができ、きっとこれらの課題を解決する糸口になることでしょう。
では、Parnassus Parallel Debugger(以降、並列デバッガ)を実行し、もっと詳して機能を見ていきましょう。 次のセクションでは、並列スレッドビューと並列コールスタックについて説明します。さらにスレッドごとの実行とステッピング、プロセスビュー、エディタでのスレッドとコールスタックを含む新しいエディタマークアップ、ブレークポイントのスレッド親和性の設定、現在の実行の移動、新しいスレッドメインメニューなどについて解説していきます。
並列スレッド(Parallel Threads)ビュー
並列スレッド(Parallel Threads)ウィンドウを表示するためには、IDEのメインメニューの[表示] – [デバッグ] – [Parallel Threads]を選択します。
このウィンドウには、プロセス内のすべてのスレッドが横方向に一覧表示されます。 Windows アプリケーションを実行中に各スレッドのCPU使用率が表示されるチャートが表示されます。(下図)
アプリケーションを一時停止すると、各スレッドのコールスタックが表示されます。(下図)
- すべてのスレッドには、アプリケーションで実行されている各スレッドごとに固有の色が割り当てられています。(例えば、メインスレッドにはミディアムブルー色)この色割り当ては、各スレッドを一見して識別可能な視覚的なガイドとしての役割を持っています。
- スレッド名が表示されます。メインスレッドに名前を付けなくても、並列デバッガ は、それを賢く検出します。
- 現在のスレッドは太字で表示され、その周りにはその色の細い境界線がついています。スレッドのタイトル(名前)をダブルクリックすると、それが現在のスレッドになります。
- ソースコードが無い、つまり CPUビューを使用しないとデバッグできないコールスタックエントリは、デフォルトでは折りたたまれており、必要に応じて展開することができます (または、従来のコールスタックを表示するためにオフにすることもできます)。
プロセスを一時停止すると、デバッガは常にデバッグ可能なコールスタックを最上位に表示します。またコールスタックエントリ内にデバッグ可能なソースコードがあれば、CPUビューではなく、ユーザーコードを表示します。
Parallel Threadsビューの各スレッドで用意されているツールバー(上図)の一番左のボタンは、ボタンを押したスレッドを現在のスレッド(CurrentThread)に変更し、プロセス全体を一時停止します。一番右のボタンでは、スレッドを左または別の固定スレッドの隣に固定することにより、スレッドが表示される順序を変更できます。これは、アプリケーション内に多数のスレッドがあり、関心のあるスレッドをまとめておきたい場合に便利です。固定されたスレッドに名前がある場合、固定した位置はプロセスの再起動後も保持されます。アプリを終了して再起動すると、同じスレッドが固定されます。
シングルスレッドの実行またはステッピング
Parallel Threadsビューの各スレッドで用意されているツールバー(上図)は、スレッドの実行を制御するためのボタンです。
IDEの通常の実行、ステップオーバー、ステップインなどのコントロールはプロセスレベルのもので、プロセス全体を実行し、すべてのスレッドを起動します。実際には、多くの例外やブレークポイントなどが発生する可能性があります。さらに、もちろん、単一のスレッドのデバッグ中に他のスレッドが実行されないようにしたい場合もあります。
- このスレッドだけを実行して、他のすべてのスレッドを一時停止のまま維持する
- このスレッドを一時停止したまま、他のすべてのスレッドを実行する
- このスレッドでのみ、メソッドにステップインする
- このスレッドでのみ、コード行をステップオーバーします。 これにより、このスレッドのみが実行およびステップ実行できます。 他のスレッドを同時に実行することはできません。
- このスレッドのためだけに、メソッドが戻るまで実行されます。
これらを使用するには、タイトルまたは名前をダブルクリックして、開発者の興味があるスレッドが現在のスレッドであることを確認します。 タイトルが太字で描画されているのがわかります。
これらにはそれぞれキーボードショートカットがあり、マウスでボタンをクリックするだけでなくキーボードを使ってステップ実行することができます。ショートカットは、現在のスレッドのメニュー項目を持つスレッドメニューに表示されます。
スレッド単位の実行制御は、並列デバッガの最も強力な機能の1つです。
エディタの統合
マルチスレッドアプリケーションで何が起こっているかを理解する上で重要なタスクの1つは、コードの同じ箇所で複数のスレッドが実行されているかどうかを知ることです。各スレッドのコールスタックのマークアップをエディタに追加することで、これを明確にします。これらのマークアップは、エディタの右側にある小さな色付きマーカー「タグ」で表示されます。
一番上のコールスタックエントリ(つまり、スレッドが「現在」実行されている場所)は、各スレッドの固有色を使用した実線のタグでマークされています。同じスレッドの他のコールスタックエントリは、スレッドの色が薄くなっています (スレッドはタグの中の実線の円でマークされていることに注意してください)。
これにより、コードを素早く読むことができ、「スレッドXはこのコード行内のどこかで実行されている」「スレッドYとスレッドZは両方とも現在同じメソッド内にある」ことを知ることができます。また、スレッドが正確にどこにあるかもわかります。
このスクリーンショットの例では、現在のスレッドが青く表示されており、2番目のスレッド(明るい赤)はIsPrime()内の現在の実行ポイントで実行されていますが、IsPrimeの呼び出しにより、現在のスレッドの実行ポイントの上の行が強調表示されています。
Moving Execution
このプラグインをインストールする前、IDEは現在のスレッドの実行ポイントを小さな青い矢印で表示していましたが、プラグインをインストールするとコードエディタの左側にある大きなシェブロン(逆V字形)に置き換えられます。
このマーカーをクリックしてドラッグするだけで、実行ポイント(次に実行またはステップを押したときにスレッドが実行を開始する場所)を変更できます。
ブレークポイントとスレッドの親和性
デフォルトでは、ブレークポイントはすべてのスレッドに適用されます。 プラグインをインストールする前は、ブレークポイントは赤い点で描画されていましたが、並列デバッガではスレッドに色が付けられ、例えば、赤は赤いスレッドを意味します。 すべてのスレッドに適用されるブレークポイントは、マルチカラー(多色)のホイールで描画されるようになりました。
ブレークポイントを特定のスレッドのみに適用させるには、ブレークポイントを右クリックします。 新しいブレークポイントメニューでは、ブレークポイントを適用するスレッドを選択することができます。
ここでは、このブレークポイントは緑のスレッドにのみ適用されます。
プロセスビュー
プロセス(Process)ウィンドウを表示するためには、IDEのメインメニューの[表示] – [デバッグ] – [Process]を選択します。
このウィンドウには、プロセス全体に関する情報が表示されます。プロセスレベルの CPU 使用率 (再びカーネルとユーザモードに分かれています)、プロセスの種類 (例:Wow64)、および実行/一時停止/リセットなどのボタンが表示されます。これらはプロセスレベルのもので、IDE独自の実行ツールバーと同じ機能を提供します。
また現在のスレッドをすばやく選択する方法として、下部のボタンをクリックしてスレッド一覧を見ることもできます(スレッドが多い場合、スレッドビューで横方向にスクロールすると時間がかかる可能性があるため)。
スレッドのメインメニュー
プラグインをインストールすると、IDEのメインメニューの項目に[Thread]が追加されます。(追加される場所は[実行] メニューの右側)
このメニューが追加されることによって、スレッドの制御は直接、このメニューから操作することができるようになります。
このメニューでは、対象のスレッド(つまり、プロセスが一時停止されている場合は現在のスレッド、または次に一時停止したときに現在のスレッドに切り替えたいスレッド)を設定することができ、現在のスレッドにはスレッド実行制御のためのメニュー項目があります。これらのメニュー項目にショートカットが表示されます。
また、アプリケーション内の各スレッドの一覧が表示され、各スレッドについて、制御とピン留めを実行することを示します。(実質的に並列スレッドビューと同じ機能です。)
機能レベル
[Thread]-[Features]の機能レベルのメニューでは、並列デバッガがスレッドのコールスタックをどこまで追跡するか(追跡の深度)を制御することができます。変更できる機能レベルは、[All Call Stacks]、[Selected Call Stacks] 、[CPU Only]の3つです。
- [All Call Stacks]: 全てのコールスタックを追跡します。
- [CPU Only]: 最も低いレベルで、CPU使用率の追跡のみを行います。並列デバッガをインストールしたいが、現在このアプリで積極的に使用したくない場合は、この機能レベルを選択してください。
- [Selected Call Stacks]: もしアプリケーション内でスレッドが数十または数百個実行されている状況では、開発者はスレッドのサブセットにしか興味がない可能性が高いでしょう。このような状況で、この機能レベルを設定すると、並列デバッガは、デフォルトでメインスレッド、ピン留めされたスレッド、および現在のスレッドのコールスタックのみを追跡します。 スレッドビューのコールスタック領域の上に表示されるボタンをクリックすることで、いつでも任意のスレッドのコールスタックを取得することができます。
対応プラットフォーム
Parnassus Parallel Debuggerは、Windows上のアプリケーションをローカルでデバッグする場合は、フル機能を発揮します。
Windows以外のプラットフォームまたはリモートデバッグを行う場合は、プラットホームごとにデバッガがサポートしている機能は異なります。
CPU 使用率は、ローカル (非リモートデバッグ) の Windows アプリケーションでのみサポートされています。スレッド単位でのステッピングや実行は、スレッドフリーズをサポートしているプラットフォームでのみ機能します。C++ Win64 では、コール スタックを評価できないという既知の問題(RSP-29768)があります。この問題は、今後リリースされるC++Builderの後継バージョンで修正される予定です。
Parnassus Parallel Debuggerについて
以下は、Parnassus社からいただいたコメントです。
並列デバッガが GetIt に登場!
Parnassus は Embarcadero のおかげで、RAD Studioのアップデートサブスクリプションが有効なユーザー向けに無償で利用できるようになりました。GetIt を開き、[IDE Plugins] カテゴリに移動し、[Install] をクリックします。
Parnassus と Embarcadero は、この拡張機能が IDE に素晴らしい追加機能をもたらすことを期待しています。
個人的なメモとしては、このプラグインに興味を持ち、GetIt に追加したいと思ってくれた Embarcadero と、8月から徐々に品質が向上しているこのプラグインの様々なバージョンを使用してくれたベータテスターに感謝したいと思います。皆さん、本当にありがとうございました。