如何配置 Qt Creator 和/或 gdb,以便在使用 Qt 库调试我的程序时,调试器将避免进入 Qt 的源文件?
4 回答
您需要关闭 auto-solib-add。在正常的 gdb 提示符下,您将键入:
(gdb) set auto-solib-add off
在 Qt Creator 中,在 Options->Debugger->Gdb 下,您可以指定 Gdb 启动脚本。创建一个包含“set auto-solib-add off”命令的文件,然后将 Gdb 启动脚本设置为该文件。
您想要的功能(如 rpg 所述)无法从GDB
中获得,恕我直言,如果它被实现,将很难使用。
提出了一个类似但更易于使用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
命令清除任何目录(有关语法等,请参见上面的链接)
您还可以通过转到“调试 -> 视图 -> Gdb”来查看 gdb 控制台,以获取有关当前使用show directories
gdb 中的命令使用的源目录的信息,如果您想这样做,请手动清除任何内容根据具体情况。
也许不是这个问题的完美解决方案,但可能有助于排除您的项目不存在的目录(即第 3 方库、系统头文件(如 STL)等)。如果是这样,请查看https://stackoverflow.com/a/31629136/5155476和https://stackoverflow.com/a/42721326/5155476。前者允许您在运行 GDB 时指定要跳过的目录(和所有子目录)(因此您可以随时更改设置),但它需要您构建 GDB。后者允许相同的功能,但在运行 GDB 之前预先设置,并且不需要构建 GDB。