我应该如何配置 Qt Creator 和/或 gdb,以便在使用 Qt 库调试我的程序时,调试器可以避免进入 Qt 的源文件?
我应该如何配置 Qt Creator 和/或 gdb,以便在使用 Qt 库调试我的程序时,调试器可以避免进入 Qt 的源文件?
(gdb) set auto-solib-add off
在Qt Creator中,选项->调试器->Gdb下可以指定一个Gdb启动脚本。创建一个包含"set auto-solib-add off"命令的文件,然后将你的Gdb启动脚本设置为该文件。
std::forward (__t=@0x7fffffffccff: false) at /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/11.1.0/../../../../include/c++/11.1.0/bits/move.h:78
78 { return static_cast<_Tp&&>(__t); }
- Carlo Wood您想要的功能(由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控制台,以获取有关它当前正在使用哪些源目录的信息,并手动清除任何目录,如果您想逐个案例执行此操作。