このページでは

GDB を使用したリモートデバッグ

一般的なケースとして、リモートマシンまたはコンテナにすでに GDBserver がインストールされており、Run ボタン(またはCtrl+R)を選択することでアプリケーションのリモート実行が設定済みで正常に動作している場合、Debug ボタン(またはF5)を選択することでリモートデバッグを開始できます。

この場合、「Qt Creator 」が起動し、デバッグサーバーとリモートマシン上のアプリケーション、および開発ホスト上の実際のデバッガーを正しい順序で自動的に接続します。

これが推奨される方法です。

この自動セットアップの要件を満たしていない場合でも、リモートマシンで GDB サーバー(または GDB シリアルプロトコルを使用する互換性のあるプローブ)を実行できる場合は、Qt Creator を使用してアプリケーションをデバッグすることができます。

アプリケーションが実行中、リモートマシンへの SSH アクセスが可能

リモートマシン上で既に実行中のアプリケーションにアタッチしたい場合、かつローカルマシンのホストから SSH 経由でデバッグサーバーを起動できる場合は、Debug >Start Debugging >Attach to running applications に移動してください。

アプリケーションが実行されておらず、リモートマシンへのターミナルアクセスが可能な場合

ローカルマシンからSSH経由でデバッグサーバーを起動できない場合は、デバイスのマニュアルを参照し、デバッグサーバーを起動する別の方法を確認してください。

リモートマシンへのターミナルアクセスが可能で、そこに GDB サーバーがインストールされている場合は、実行ファイルをリモートマシンに手動で転送し、ポート番号と実行ファイルを指定してgdbserver を起動できます:

gdbserver :1234 /path/to/executable

通常、次のような応答が返されます:

Process /path/to/executable created; pid = 5159
Listening on port 1234

Qt Creator を実行しているローカルマシンでは:

  1. Debug > [Start Debugging ] > [Attach to Running Debug Server] の順に選択します。

    「実行中のデバッグサーバーに接続」ダイアログ

  2. Kit で、プロジェクトのビルドに使用するビルドおよび実行キットを選択します。
  3. Server port で、リモートマシンの名前と使用するポート番号を入力します。
  4. Local executable 」で、ローカルマシン上のアプリケーション実行ファイルへのパスを指定します。
  5. Command line arguments で、実行ファイルに渡すコマンドライン引数を指定します。
  6. Working directory 」で、作業ディレクトリを指定します。デフォルトはビルド結果のディレクトリです。
  7. コンソールアプリケーションの場合は、[Run in terminal ] を選択します。
  8. メイン関数でデバッガーを停止させるには、「Break at "main" 」を選択します。
  9. target extended-remote mode で接続を作成するには、「Use target extended-remote to connect 」を選択します。このモードでは、デバッグ対象のアプリケーションが終了した場合や、アプリケーションから切り離した場合でも、デバッガはターゲットへの接続を維持します。 アプリケーションを再実行したり、実行中のアプリケーションにアタッチしたり、ターゲット固有のモニターコマンドを使用したりすることができます。たとえば、GDB は--once オプションを使用して呼び出されない限り終了しませんが、monitor exit コマンドを使用することで終了させることができます。
  10. Override SysRoot では、デフォルトのsysroot の代わりに、使用するsysroot のパスを指定します。
  11. Init commands 」で、ターゲットへの接続が確立された直後に実行するコマンドを入力します。
  12. Reset commands で、ターゲットへの接続をリセットする際に実行するコマンドを入力します。
  13. [Debug information] で、デバッグ情報を保存する場所を指定します。空のパスは使用できません。
  14. Override server channel で、シリアルラインやカスタムポートなど、使用する通信チャネルを指定します。
  15. [Recent] で、使用する最近の設定を選択します。
  16. OK 」を選択して、デバッグを開始します。

デフォルトでは、応答のない GDB プロセスは 40 秒後に終了します。「GDB timeout 」でタイムアウト時間を延長するには、[Preferences ] > [Debugger ] > [GDB] の順に移動します。

GDB でのtarget extended-remote モードによる接続の詳細については、「GDB によるデバッグ:リモートターゲットへの接続」を参照してください。

アプリケーションが実行中、リモートマシンへのターミナルアクセスが可能、かつ gdbserver が利用可能

このケースは、gdbserver の起動方法が異なる点を除き、前のセクションとほぼ同じです:

gdbserver --attach :1234 <PID of running application>

SSHポートフォワーディングを使用する

GDBサーバーポートを公開できないリモートターゲットでデバッグを有効にするには、SSHトンネリングを使用してリモートポートをローカルポートにマッピングします。Qt Creator は、ローカルポートとリモートポートを自動的に検出します。

SSHポートフォワーディングを有効にするには:

  1. Preferences > [Devices] へ移動します。

    「デバイス」環境設定内のリモートLinuxデバイス

  2. Device で、「Remote Linux Device 」を選択します。
  3. Use SSH port forwarding for debugging 」を選択します。
  4. Apply 」を選択します。

コマンドによる GDB サーバーの起動

プロジェクトの一環として GDB サーバーの設定を自動化および永続化したい場合(たとえば、リモートデバイス上で `gdbserver ` を起動するスクリプトがある場合など)、`Remote Debugger ` 実行構成を追加します。デバッグを開始するたびにランチャーコマンドが自動的に実行されるため、手動で接続を設定する必要はありません。

「リモートデバッガー」の実行構成を追加するには:

  1. Projects 」 > 「Run Settings 」に移動します。
  2. Add 」 > 「Remote Debugger 」 > 「Create 」を選択します。
  3. Command 」で、GDB サーバーへの接続を設定するスクリプトまたはコマンドを指定します。
  4. Command line arguments 」で、ランチャーコマンドに渡す引数を指定します。
  5. Symbol file (local executable) では、ローカルマシン上のアプリケーション実行ファイルへのパスを指定します。
  6. Server channel 」で、使用する通信チャネルを指定します。デフォルトは「tcp://127.0.0.1:1234 」です。
  7. Break at "main" を選択すると、デバッガーが main 関数で停止します。
  8. コンソールアプリケーションの場合は、「Run in terminal 」を選択します。
  9. 拡張リモートモードで接続するには、「Use "target extended-remote" to connect 」を選択します。
  10. キット セレクターで実行構成を選択し、F5キーを押してデバッグを開始します。

「方法: デバッグ」「方法: リモート Linux 向けの開発」「GDB」、「デバッグ」、「デバッガ」、および「キットの管理も参照してください

Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.