お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2009-01-03 17:56:30

taku_s
メンバ
登録日: 2008-12-14

Qt4 でのデバッグ法

お世話になります。
Qt4でのGUIアプリ開発に挑戦していますが、ブレークポイントが設定できませんし、止まりません。
状況は
OX.porファイルに CONFIG += qt debug行を追加
~$ qmake
~$ make
~$ gdb OX
(gdb)b 関数名
Function "関数名" not defined
Make breakpoint pending on future share library load? (y or [no]) y

Breakpoint  1 "関数名" pending .
(gdb) r
Starting program: /home/.../..../OX
[Thread debugging using Libthead_db enadled]
[New Thread 0xb6...... (LWP 8296)]

ここで、自作のGUI画面にフォーカスが移り、ターミナルのフォーカスが帰ってこなくなります。
目的の関数内にprintf("Debugging Text=%s¥n",text1);のような行を入れても
GUIを終了した後に、ターミナルに表示されます。

Qtのデバッグ方法についてお詳しい方、ご指導お願いいたします。

オフライン

 

#2 2009-01-03 23:37:19

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

Re: Qt4 でのデバッグ法

Qt4 のプロラムは書いたことが有りませんが,

taku_s による投稿:

~$ gdb OX
(gdb)b 関数名
Function "関数名" not defined
Make breakpoint pending on future share library load? (y or [no]) y

Breakpoint  1 "関数名" pending .

* この関数名は具体的には書けないのですか?
* (gdb) b main でも止まりませんか?

break point を仕掛けたい関数が libqt4 内にある場合,
libqt4-debug パッケージをインストールしないと,gdb がシンボルを見つけられないかもしれません

訂正します.
以上の発言は撤回します.
自作の関数にbreak point を仕掛けたいのですね.読み落としてました.

not defined とあるのが気になります.
$ nm OX | grep 関数名
で break point を仕掛けたいシンボルが OX にあることが確認できますか?

static な関数だと
(gdb) b ファイル名:関数名
でないと break point は仕掛けられないはずです.

あと行番号で break point を設定するのも一つの手かと.

最後の編集者: einundzwanzighundertsechs (2009-01-04 01:16:02)

オフライン

 

#3 2009-01-04 09:05:15

taku_s
メンバ
登録日: 2008-12-14

Re: Qt4 でのデバッグ法

einundzwanzighundertsechsさま
ありがとうございました。
nm関数を知りませんでした。
早速、検索するとcpp内で void SendText() と書いたものか  _ZN10testDialog8SendTextEvになっており、
この関数名でブレークするとちゃんと止めることができまいした。

>あと行番号で break point を設定するのも一つの手かと.
Qtの場合、どうしても分割コンパイルになってしまします。今回のテストコードも5本のcppになってしまいました。
その上、mainではGUIを表示するだけで、Windowsでのメッセージループの部分が見えなくなっていますので
関数名でしか、ブレークできないように思います。
testDialog.cpp内の何行目にブレークなんてことは、gdbはできませんよね?(gdbにもあまり詳しくないもので)
eclipseでのデバッグもやってみたんですが、あまりの遅さにあきらめました。
何か、使いやすいIDEをご存知ないでしょうか?

オフライン

 

#4 2009-01-04 13:39:54

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

Re: Qt4 でのデバッグ法

早速、検索するとcpp内で void SendText() と書いたものか  _ZN10testDialog8SendTextEvになっており、
この関数名でブレークするとちゃんと止めることができまいした。

私はほとんど使ったことがないですが,
もしかしたら言語は C++ じゃないかと思っていました.
というのは C++ は引数の型が異なる関数を同じ名前で複数定義できるため,
シンボルに引数やクラスの情報を付加する(mangleと言います)からです.

もしかして,SendText は,何かのクラスのメソッドだとか,名前空間に含まれているとかしませんか?
その場合は名前解決演算子 :: が使えるのでは?(経験ありませんが)
(gdb) b クラス名::メソッド名

testDialog.cpp内の何行目にブレークなんてことは、gdbはできませんよね?(gdbにもあまり詳しくないもので)

(gdb) b ファイル名:行番号
で出来ます.
C言語でも他人のソースを改良(改造,改悪?)するとき,
思いもかけないところに #define があって実際の関数名が変わっていたりしていて
ソースコードの名前の通りでは止まらないことがあります.
シンボルを探すのも面倒な時はこれで止めてます.

最後の編集者: einundzwanzighundertsechs (2009-01-04 13:41:15)

オフライン

 

#5 2009-01-04 13:43:03

kio
新しいメンバ
From: 茨城県ひたちなか市
登録日: 2007-07-14

Re: Qt4 でのデバッグ法

gdbでソースファイルの行数を指定してブレークポイントを設定出来ます。

手順:
gdb program          開始する。
b  src/aaaa.cpp:25      ソースコードの後ろに':'をセパレータにして行番号
                             該当する行が見つかればブレークポイントを設定した等のmsgが出る。
run               で実行させると、該当行で止まります。

もしも、動作をみて、他の場所にブレークポイントを設定したい場合は
ブレークしている状態で

b 64                        次の行を入れて
c                             で、64行で止まります。

Qt用のIDEですが、私はeclipseのプラグインにTrolltecで無償で公開しているQt-eclipse-intgration-linux.x86
を使用しています。 

eclipseのデバッグモードで重い様であれば、qDebug()を使用してみて下さい。

 qDebug() << "Test Out aaa=" << flag;

等とやれば、この行を実行した瞬間にターミナルに出力されます。
eclipseでの実行であれば、eclipseのコンソール画面に出力されます。

最後の編集者: kio (2009-01-04 13:52:48)

オフライン

 

#6 2009-01-04 19:55:54

taku_s
メンバ
登録日: 2008-12-14

Re: Qt4 でのデバッグ法

einundzwanzighundertsechsさま kioさま

ご指摘の通り、C++でクラスにしていました。
testDialog::SendTextで問題なくブレーク設定できました。
また。testDialog.cpp:57で行番号でのブレークもできました。(ただ、cppの行番号とは違いましたが)

eclipseプラグインですか 勉強してみます。

どうも、ありがとうございました。

オフライン

 

#7 2009-01-04 22:27:48

einundzwanzighundertsechs
メンバ
登録日: 2008-12-28

Re: Qt4 でのデバッグ法

taku_s による投稿:

testDialog.cpp:57で行番号でのブレークもできました。(ただ、cppの行番号とは違いましたが)

gcc/g++ に最適化を指示していると( -O2 オプション)処理が並べ替えられて,
思ったところでは止まりません.ステップ実行しても次にどの行に飛ぶか分からなくて苦労します.

オフライン

 

Board footer

Powered by FluxBB