Qtの設定 - デバッグ
概要
Qt Creatorにおいて、デバッグに関する設定方法を記載する。
CMakeの設定
Qt Creatorで、CMakeを使用するプロジェクトを作成してデバッグを実行するとき、以下の警告文が表示される場合がある。
warning: GDB: Failed to set controlling terminal: ...
下図に示すように、Qt Creatorの左側パネルにある[プロジェクト] - [Build & Run] - [Run]を選択する。
[実行時の選択]画面が表示されるので、[実行]項目の[ターミナルで実行]チェックボックスにチェックを入力する。
これにより、QT Creatorは、GDBで適切に動作するXterm(デフォルト)内でプログラムを実行する。
デバッグターミナルの設定
デバッグターミナルを別のソフトウェアに変更する場合は、Qt Creatorのメニューバーから、
[ツール] - [オプション] - [環境] - [システム]タブ - [ターミナル]項目に、デバッグターミナルとして使用するソフトウェアのフルパス名を記述する。
このパラメーターは、外部コマンドまたはソフトウェアを実行するように指示する。
# Gnome Terminalをデバッグターミナルに設定する場合 (推奨) /usr/bin/gnome-terminal -x # Alacrittyをデバッグターミナルに設定する場合 (推奨) /<Alacrittyのインストールディレクトリ>/alacritty -e # X terminalをデバッグターミナルに設定する場合 /usr/bin/xterm --separate -e # X terminalをroot権限としてデバッグターミナルに設定する場合 /usr/bin/xterm --separate -e sudo # konsoleをデバッグターミナルに設定する場合 (KonsoleおよびYakuakeは動作しない可能性あり) /usr/bin/konsole --separate -e
また、初期設定では、デバッガが開始されるとQT Creatorもフォアグラウンドに配置されて、開始されたターミナルが背面に表示される。
この動作を変更(デバッグターミナルを前面に配置)するには、Qt Creatorのメニューバーから、
[ツール] - [オプション] - [デバッガ] - [一般]タブ - [Bring Qt Creator to foreground when application interrupts]チェックボックスをオフにする。
デバッガの設定
デバッガを設定するには、[ツール] - [オプション]を選択する。
[オプション画面]画面が開くので、画面左の[デバッガ]を選択する。
- [一般]タブ
- 全てのデバッガに共通の設定を行う。
- [GDB]タブ
- GDBプロセスの設定を行う。
- GDBプロセスを終了するためのタイムアウトを指定するには、GDBタイムアウトフィールドに待機する秒数を設定する。
- 大きなライブラリの読み込みやソースファイルの一覧表示に時間が掛かる場合は、値を大きくする必要がある。
- デバッガの起動時にデフォルトの.gdbinitファイルを読み込むには、[Load .gdbinit file on startup]チェックボックスを選択する。
- インストールされているまたはアプリケーションが使用するライブラリにリンクされている標準のGDBプリティプリンタを使用するには、
- [Load system GDB pretty printers]チェックボックスを選択する。
- GDBがリモートターゲットに正常にアタッチされた後にGDBコマンドを実行するには、[Additional Attach Commands]フィールドに入力する。
- ここでは、モニタのリセット・ロード等、ターゲットをさらにセットアップするためのコマンドを追加することができる。
- [GDB拡張]タブ
- この設定では、GDBの高度な機能や実験的な機能を使用することができる。
- しかし、これらの機能を有効にすると、デバッグ作業に悪影響を及ぼす可能性があるので、注意して使用すること。
- 非同期モードを制御する場合は、それぞれのチェックボックスを選択する。
- GDB起動時に/usr/src/debug等のデバッグ情報の場所に共通のパスを追加するには、デバッグ情報の共通の場所を使用するチェックボックスを選択する。
- qWarning、qFatal、abortが呼び出された時に停止するには、それぞれのチェックボックスを選択する。
- 逆引きを有効にするには、逆引きを有効にするチェックボックスを選択する。
- この機能は非常に遅く、システムコールを逆行する際に予測不可能な動作を示し、デバッグセッションを破壊する可能性が高い。
- フォーク後に全ての子プロセスをデバッグし続けるには、[すべての子プロセスをデバッグする]チェックボックスを選択する。
qDebug関数
qDebug
関数は、デバッグログをQt Creatorの[アプリケーション出力]ペインに出力するために使用する。
また、qDebug
関数以外にも、以下のような同様の関数が存在する。
- qInfo()
- qWarning()
- qCritical()
- qFatal()
qDebug
関数は、printf
関数と同様の形式で使用できる。
#include <QDebug>
qDebug("test");
qDebug("int:%d", 10);
qDebug("double:%lf", 123.45);
qDebug("string:%s", u8"abcあいう");
qDebug
関数をC++のストリーム形式で使用する場合、QDebug
をインクルードする必要がある。
#include <QDebug>
qDebug() << "test";
qDebug() << "int:" << 10;
qDebug() << "double:" << 123.45;
qDebug() << "string:" << u8"abcあいう";
また、<<
を使用して出力した場合に付加される空白を無くすには、nospace
を指定する。
#include <QDebug>
qDebug().nospace() << "test";
qDebug().nospace() << "int:" << 10;
qDebug().nospace() << "double:" << 123.45;
qDebug().nospace() << "string:" << u8"abcあいう";
QDateTime
等のQtの値型の多くのもの、および、QList
等のQtのコンテナ型もそのまま出力できる。
QObject
クラスの派生型は、QObject
のポインタとして出力することにより、クラス名やオブジェクト名と共に出力することができる。
#include <QDebug>
qDebug() << QString("id=%1, name=%2").arg(123).arg("name_123"); // 出力 : id=123, name=name_123
qDebug() << QDateTime::currentDateTime(); // 出力 : QDateTime(2020-12-06 21:53:19.311 東京 (標準時) Qt::LocalTime)
QList<double>{1.1, 1.2, 1.3}; // 出力 : (1.1, 1.2, 1.3)
QFile file("/etc/fstab");
file.setObjectName("fstab_file");
qDebug() << &file; // 出力 : QFile(0x4a7b6ffb50, name = "fstab_file")