26

如何配置 Qt Creator 和/或 gdb,以便在使用 Qt 库调试我的程序时,调试器将避免进入 Qt 的源文件?

4

4 回答 4

15

您需要关闭 auto-solib-add。在正常的 gdb 提示符下,您将键入:

(gdb) set auto-solib-add off

在 Qt Creator 中,在 Options->Debugger->Gdb 下,您可以指定 Gdb 启动脚本。创建一个包含“set auto-solib-add off”命令的文件,然后将 Gdb 启动脚本设置为该文件。

于 2009-09-28T11:05:41.447 回答
3

您想要的功能(如 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
于 2009-09-25T03:18:19.267 回答
1

评论澄清后更新:

在 gdb 中,您可以指定搜索哪些源目录- 如果找不到它们,它将无法进入它们。

要让 gdb 输入 qt 库的源文件,它必须知道它们在哪里——很可能 qt-creator 在启动调试器时告诉 gdb 它们在哪里。在 qt-creator 中查看 gdb 启动脚本 - 它们可能在其中指定。

如果它们没有在启动脚本中指定并且它是 gdb 自己查找源文件,您应该能够修改 gdb 启动脚本以使用该directory命令清除任何目录(有关语法等,请参见上面的链接)

您还可以通过转到“调试 -> 视图 -> Gdb”来查看 gdb 控制台,以获取有关当前使用show directoriesgdb 中的命令使用的源目录的信息,如果您想这样做,请手动清除任何内容根据具体情况。

于 2009-09-21T13:16:57.493 回答
0

也许不是这个问题的完美解决方案,但可能有助于排除您的项目不存在的目录即第 3 方库、系统头文件(如 STL)等)。如果是这样,请查看https://stackoverflow.com/a/31629136/5155476https://stackoverflow.com/a/42721326/5155476。前者允许您在运行 GDB 时指定要跳过的目录(和所有子目录)(因此您可以随时更改设置),但它需要您构建 GDB。后者允许相同的功能,但在运行 GDB 之前预先设置,并且不需要构建 GDB。

于 2019-01-05T15:02:29.750 回答