如何在 C++ 头文件上使用 gdb?

Posted

技术标签:

【中文标题】如何在 C++ 头文件上使用 gdb?【英文标题】:How to use gdb on c++ header files? 【发布时间】:2013-03-04 18:31:52 【问题描述】:

我试图在网上搜索这个问题,但我似乎找不到解决我问题的好方法。好吧,我正在尝试使用 gdb 来调试我的 c++ 程序。该程序由一个简单的 main.cpp 和一个 model.h 组成。而编译命令是

g++ -Wall -g -c main.cpp
g++ -Wall -g main.o -o OUTPUT

由于几乎所有算法都存储在 model.h 中,因此我需要调试该头文件而不是 cpp 文件。但是,每当我尝试在标题上放置一个断点,例如

tbreak model.h:163

gdb 总是给我一条消息“没有名为 TNFmodel.h 的源文件”。

在另一个问题breakpoints in GDB 中,我看到了一个解决方案,通过“dir”将包含标题的文件夹添加到库中。但我的头文件已经在源文件夹中,并且尝试后

dir ./

问题依然存在。

所以有人知道怎么了?如何使用gdb调试头文件?

【问题讨论】:

编译时是否也包含该位置的标头?也许您可以发布输入info sources时gdb给出的输出。 哎呀...我检查了来源,现在发现了问题...字母的大小写不匹配。嗯,我也不知道我是怎么通过编译的……不过可能是因为我用的是mac,有时候编译的时候大小写不敏感。更正大小写后,gdb 适用于标头。谢谢。 【参考方案1】:

正如https://***.com/users/760746/nobody 所建议的那样,确保标题在源中的一种方法是通过检查来验证它

info sources

在确保标头本身位于源中之后(在我的情况下,问题是标头名称中字母的大小写被混淆了,并且不知何故它通过了我的 mac book 上的编译),在头文件的行就可以了。

【讨论】:

它在mac book上工作的原因是磁盘被格式化为不区分大小写,因此文件名的大小写没有任何区别。【参考方案2】:

尝试将 break 与您的类/方法名称一起使用,如下所示:

break  class::method

【讨论】:

所以我不能直接进入该方法的一行,而是必须先进入该方法,然后跟踪到我希望它中断的行?听起来……不太方便…… 我不知道还有什么可能,sry 老兄 我也没有,所以才问...有时候缺少这个功能真的很不方便...【参考方案3】:

我发现文件名有时会缩短。使用 info sources 我能够找到 GCC 使用的缩写名称。当我使用缩短的文件名设置断点时,GDB 正确设置了断点。

例如文件CommonLibrary\headers\Endian.h更改为COM~2\headers\Endian.h

这在 Windows 10 上,运行 mingw-64。

【讨论】:

以上是关于如何在 C++ 头文件上使用 gdb?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建仅包含主文件和模板头 (C++) 的 makefile

如何在 Unix 上包含 «pty.h» 头文件/将 «pty.h» 添加到标准库 C / C++

如何隐藏 C++ 头文件中的函数

如何使用 Qt Creator 将 C++ 头文件添加到 Qt 项目

C++中关于如何使用自己编写的头文件问题!有代码

C++:命名空间——如何在头文件和源文件中正确使用?