Qtライブラリを使用してプログラムをデバッグしているときにデバッガーがQtのソースファイルにステップインしないように、Qt Creatorやgdbを構成するにはどうすればよいですか?
4 に答える
auto-solib-addをオフにする必要があります。通常のgdbプロンプトから、次のように入力します。
(gdb) set auto-solib-add off
Qt Creatorの[オプション]->[デバッガー]->[Gdb]で、Gdb起動スクリプトを指定できます。「setauto-solib-addoff」コマンドを含むファイルを作成してから、Gdb起動スクリプトをそのファイルに設定します。
必要な機能(rpgで説明されている)はから利用できませんGDB
。実装されている場合、IMHOは使用が困難になります。
同様ですが、より使いやすいfstep
機能がに提案されていGDB
ます。与えられた:
foo((string("Hello") + string(" World!)).c_str());
これfstep
は、最後の呼び出しを除いて、現在の行のすべての呼び出しをスキップします(したがって、文字列コンストラクター、、、operator+()
およびをスキップしc_str()
、にのみステップインしfoo
ます)。
これも実装されていませんが、数か月以内に実装される可能性があります(C++
デバッグに非常に役立ちます)。
それまでの間、一時的なブレークポイントを設定することで、機能を概算できます。
(gdb) list
1 #include <string>
2 #include <iostream>
3 using namespace std;
4
5 void foo(const char *s)
6 {
7 cout << s << endl;
8 }
9
10 int main()
11 {
12 foo((string("Hello") + string(" World!")).c_str());
13 return 0;
14 }
(gdb) b main
Breakpoint 2 at 0x8048901: file t.cc, line 12.
(gdb) run
Breakpoint 1, main () at t.cc:12
12 foo((string("Hello") + string(" World!")).c_str());
(gdb) tb foo
Breakpoint 3 at 0x80488ca: file t.cc, line 7.
(gdb) c
foo (s=0x804a1f4 "Hello World!") at t.cc:7
7 cout << s << endl;
(gdb) q
コメントの明確化後に更新:
gdbでは、検索するソースディレクトリを指定できます。ソースディレクトリが見つからない場合は、それらにアクセスできません。
gdbがqtライブラリのソースファイルに入るには、それらがどこにあるかを知っている必要があります-qt-creatorがデバッガーを起動したときにgdbにそれらがどこにあるかを伝えている可能性があります。qt-creatorでgdb起動スクリプトを探してください。そこで指定されている可能性があります。
スタートアップスクリプトで指定されておらず、gdbが独自にソースファイルを検出している場合は、コマンドを使用してディレクトリをクリアするようにgdbスタートアップスクリプトを変更できますdirectory
(構文などについては、上記のリンクを参照してください)。
show directories
[デバッグ]->[ビュー]->[Gdb]に移動して、gdbのコマンドで現在使用しているソースディレクトリに関する情報を取得し、これを実行する場合は手動でオフにすることで、gdbコンソールを表示できる場合もあります。ケースバイケースで。
この質問に対する完全な解決策ではないかもしれませんが、プロジェクトがないディレクトリ(つまり、サードパーティのライブラリ、システムヘッダー(STLなど)など)を除外すると役立つ場合があります。その場合は、 https://stackoverflow.com/a/31629136/5155476およびhttps://stackoverflow.com/a/42721326/5155476をご覧ください。前者では、GDBの実行中にステップするときにスキップするディレクトリ(およびすべてのサブディレクトリ)を指定できます(したがって、いつでもセットを変更できます)が、GDBをビルドする必要があります。後者は同じ機能を許可しますが、GDBを実行する前に事前設定されており、GDBをビルドする必要はありません。