読者です 読者をやめる 読者になる 読者になる

ローグウェーブソフトウェアのブログ

開発をシンプルに 安全で高品質のコードを 素早くお客様のもとへ

並列デバッガ TotalViewの多様なインターフェースと使い方

ローグウェーブ ソフトウェアが開発、販売する並列デバッガTotalViewは、ステップ実行からメモリデバッグやリバースデバッグ、並列アプリケーションのデバッグなど多くの機能を備え、また多様な実行環境や開発環境に対応しています。それだけでなく、使いやすいGUIコマンドライン、バッチデバッグなど必要とされる場面に応じてさまざまな使用形態を用意しています。あまりに多いためマニュアルなどの説明で混乱することもあるかもしれません。この記事ではそれぞれの使用方法を紹介いたします。

www.roguewave.jp

0. TotalViewのGUICLIの関係

ユーザーズガイドでCLIを説明している章の冒頭に以下の図があります。 f:id:RWSJapan:20170313094457p:plain

About The CLI and TotalView

この図が示しているのは、TotalViewのGUIや(CLI)コマンドラインインターフェース、バッチデバッグといった様々なインターフェースは全てこの、本質的に単一のデバッグエンジンへのシェルとして機能しており、内部で行われていることは同一である、ということです。デバッグ対象のプログラムやプロセス、スレッドは全てこのデバッグエンジンによって制御、監視され、インターフェースの違いによって左右されることはありません。これを踏まえれば、以下の多様なインターフェースを用途に応じて自由に選ぶことができます。

1. GUI

基本的にユーザーがログインしているローカルのコンピュータ上で実行され、インタラクティブにコードや変数の状態を操作し観察することができます。デバッガに特化しているためIDE(統合開発環境)に比べて非常に少ないマウス操作で簡単に目的の機能を実現でき、また豊富に用意されているシングルキーショートカットでキーボードに手を置いたまま多くの機能を素早く利用することができます。 以下で説明する2種類のGUIが存在します。

1.1 従来のUI

f:id:RWSJapan:20170313104646p:plain 最も一般的なインターフェースです。おなじみのルートウィンドウとプロセスウィンドウを中心に、変数の内容を表示するVariable WindowやArray Viewer、MPIの通信や配列の内容をグラフ化する機能もあります。HPC向けに大量のプロセスやスレッドを柔軟に制御し監視できます。メモリデバッガMemoryScapeとも強く連携しており、様々なデバッグ機能を統一的に使うことができます。

1.2 次世代GUI (newUI)

f:id:RWSJapan:20170207121227p:plain

逐次実行あるいはそれほど大規模でない並列実行アプリケーションのデバッグに特化したGUIで、並列ステップ実行やリバースデバッグといったTotalViewの最も不可欠な機能を中心に、従来のUIから見やすさや使いやすさを大幅に向上させました。ドッキング可能なパネル、関数や変数の検索機能などが単一のウィンドウに収められ、ヘルプも製品に統合され、必要なときに必要な場所がすぐに参照できます。一連の動画でリバースデバッグやマルチスレッドデバッグなどの機能を紹介しています。

この新しいUIを使用する際には、TotalViewの新機能で紹介しているように、起動時に-newUIオプションをつけてください。

なお、この次世代UI部分だけ切り出したCodeDynamicsという製品名でも利用可能です。価格やライセンスの体系がTotalViewと異なります。ご興味のある方はご相談ください。

2. リモートディスプレイクライアント (RDC)

手元のWindowsMacLinuxのノートパソコンやデスクトップから、計算機サーバにSSHで接続し、GUI(上記の従来のGUI)でTotalViewを操作することができます。単純にX Windowsを転送するのに比べて高速で、また設定も容易かつ保存して再利用可能です。ローグウェーブのウェブサイトから自由にダウンロードして使うことができます。登録やライセンスは不要です。

3. CLI (コマンドラインインターフェース)

コマンドラインインタラクティブデバッグを行う方法です。

f:id:RWSJapan:20170313112114p:plain

日本語ドキュメンテーションにあるスタートガイドはTotalViewの使い方がコンパクトにまとまったおすすめの資料ですが、27ページ付近に記載されている通り、GUIを使った機能の説明の多くには対応するCLIコマンドの説明も付属しています。この記事の冒頭でご説明した通り、機能的には結局内部のエンジンで実行されていることは同一で、GUI経由で行うかCLI経由で行うか、は使いやすさのみに影響するのです。

日本語ドキュメントのTotalView CLIコマンドガイドには利用できる全てのCLIが一覧表(チートシート)になっていますので、手元に置いてお使いください。

3.1 GUIから起動

GUICLIか、の2者択一でなく、両方同時に使うこともできます。このやり方はプログラムの状態の見やすさというGUIの特性と柔軟で高速なキーボード操作、というCLIの利点を同時に活かすことができます。また、CLIを学習する際にもおすすめの方法です。例えばCLIブレークポイントを作成すると即座にGUIの画面に反映されます。ステップ実行も同様です。

従来のGUIではProcessウィンドウのメニューバーから Tools > Command Lineを選びます。新しいGUIではウィンドウ下部に最初から統合されています。機能はどちらも変わりません。新しいGUIではTotalViewの一部の機能がまだ統合されておらず利用できないため、CLI経由で行います。

3.2 端末上でGNU gdbのように起動

GUIを一切利用しない使い方です。GUIがインストールされていない環境や、計算機サーバ等へsshアクセスをして画面転送の遅延が気になるような開発作業をする際に便利です。また、マウスを使うのが面倒という方にもおすすめです。端末のプロンプトからtotalviewcliと入力するとすぐに起動します。GUIの時と同様に、起動時に対象アプリケーションを引数として与えることもできます。

4. tvscript バッチデバッグ

これまではインタラクティブにデバッガと対話し、デバッガが表示する内容に応じてステップ実行や状態表示などを指示するというデバッグの方法をご紹介してきました。しかしTotalViewはそれだけでなく非対話的なバッチデバッグの使い方も提供しています。スーパーコンピューターのジョブ管理システムにキューを投げたり、夜間にバッチ実行したり、テスト工程に組み込んでcommitなどのイベントをフックとして実行させることもできます。メモリエラーや並列関連のバグなど滅多に再現しない問題を捉える際にも有効です。

tvscriptデバッガからのフィードバッグはテキスト形式のログファイルに出力されます。並列アプリケーションでも常に単一のファイルに出力されるため、後からプロセスごとのログファイルをかき集めて集計するような手間はかかりません。

print文デバッグの強化版としても使うことができるでしょう。もちろん対象の実行コードやソースコードには一切影響を与えず、デバッグ用のスクリプトを完全に切り離して管理することができるため、製品のリリースの際にうっかりソースコードからprint文を削除するのを忘れる、といった心配もありません。

tvscriptには独自のデバッグ構文のほか、上記TotalView CLIをそのまま組み込むことができます。スタートガイド、あるいはユーザーガイドで説明されているように、TotalView CLIスクリプト言語Tclインタープリタに内蔵されており、Tclのデータ構造や制御構造、プロシージャの作成などの機能を全て利用することができるため、デバッグ用のスクリプトを作成して、非常に柔軟なデバッグシナリオを作成することができます。

例えば、アクションポイント(TotalViewの強化版ブレークポイント)に到達したり何らかのメモリイベントが発生した時に、何らかのアクション(例えばログに記入したりリプレイファイルやメモリデバッグファイルを保存)を実行するようなコールバックルーチンを作成することができます。

4.1 オプション付き実行

tvscript、あるいはメモリデバッグ専用のmemscriptには豊富な実行時オプションがあり(リファレンスガイド)、ワンライナーでtvscriptにデバッグ内容を指示することができます。例えば以下のコマンド例は、メモリデバッグ(MemoryScape)をオンにし、ソースコードの33行目でヒープメモリのHTMLレポートを出力するように指示しています。

$ tvscript -memory_debugging -create_actionpoint “combined.cxx#33=>save_html_heap_status_source_view” ./combined.elf

4.2 外部スクリプトファイル使用

リファレンスガイドに記載されているように、tvscriptに-script_fileオプションをつけることで、スクリプトファイルに記載されたコマンドを実行することができます。基本的な使い方は、イベントやアクションポイントにコールバック関数(イベントハンドラ)を関連付け、その関数の中でファイルの保存や変数の値表示などの動作を指示したり、プログラムの状態に異常がないかどうかチェックを行うことができます。

下記スライドの66枚目付近にスクリプトの例を載せています。

www.slideshare.net

まとめ

これまで見てきたように、TotalViewには多様な利用方法があります。MemoryScapeやReplayEngineの使い方、特にファイル保存まで含めるとさらに可能性が広がります。「こんな使い方はできないか?」といった疑問があればお気軽にサポートリクエストトライアルリクエストをお寄せください。

ローグウェーブ セールスエンジニア 柄澤(からさわ)