如何在使用gdb的Qt Creator中调试时避免输入库的源文件?

时间:2009-09-19 12:03:02

标签: c++ debugging qt gdb qt-creator

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

4 个答案:

答案 0 :(得分:15)

您需要关闭auto-solib-add。从普通的gdb提示符中键入:

(gdb) set auto-solib-add off

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

答案 1 :(得分:3)

GDB无法使用您想要的功能(如rpg所述),如果实施,恕我直言将难以使用。

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

答案 2 :(得分:1)

评论澄清后更新:

在gdb中,您可以指定哪个source directories are searched - 如果找不到它们,它将无法进入它们。

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

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

您也可以通过转到“Debug - &gt; Views - &gt; Gdb”来查看gdb控制台,以获取有关当前使用gdb中的show directories命令的当前使用的源目录的信息,以及如果你想根据具体情况这样做,请手动清除。

答案 3 :(得分:0)

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