
Ubuntu日本語フォーラム

ログインしていません。
お世話になります。
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のデバッグ方法についてお詳しい方、ご指導お願いいたします。
オフライン
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)
オフライン
einundzwanzighundertsechsさま
ありがとうございました。
nm関数を知りませんでした。
早速、検索するとcpp内で void SendText() と書いたものか _ZN10testDialog8SendTextEvになっており、
この関数名でブレークするとちゃんと止めることができまいした。
>あと行番号で break point を設定するのも一つの手かと.
Qtの場合、どうしても分割コンパイルになってしまします。今回のテストコードも5本のcppになってしまいました。
その上、mainではGUIを表示するだけで、Windowsでのメッセージループの部分が見えなくなっていますので
関数名でしか、ブレークできないように思います。
testDialog.cpp内の何行目にブレークなんてことは、gdbはできませんよね?(gdbにもあまり詳しくないもので)
eclipseでのデバッグもやってみたんですが、あまりの遅さにあきらめました。
何か、使いやすいIDEをご存知ないでしょうか?
オフライン
早速、検索すると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)
オフライン
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)
オフライン
einundzwanzighundertsechsさま kioさま
ご指摘の通り、C++でクラスにしていました。
testDialog::SendTextで問題なくブレーク設定できました。
また。testDialog.cpp:57で行番号でのブレークもできました。(ただ、cppの行番号とは違いましたが)
eclipseプラグインですか 勉強してみます。
どうも、ありがとうございました。
オフライン
taku_s による投稿:
testDialog.cpp:57で行番号でのブレークもできました。(ただ、cppの行番号とは違いましたが)
gcc/g++ に最適化を指示していると( -O2 オプション)処理が並べ替えられて,
思ったところでは止まりません.ステップ実行しても次にどの行に飛ぶか分からなくて苦労します.
オフライン