我正在调试一个在GDB下使用预编译头的项目。在检查崩溃堆栈跟踪时,我发现GDB打印了正确的函数名称,但文件和行号信息不正确。
请看以下示例:
file.h
#ifndef FILE_H_
#define FILE_H
#include "../precompiled_header.h"
void func_A();
void func_B();
#endif //FILE_H
请注意标题中只有五行。
file.cpp
#include "file.h"
void func_A()
{
int *a = 0;
*a =0;
}
void func_B()
{
func_A();
}
int main()
{
func_B();
return 0;
}
gdb程序 - >跑 - > bt:将打印类似
的内容....
func_A(): file.h at 32 <- incorrect file and line information
func_B(): file.h at 40 <- incorrect file and line information
main(): file.cpp at 14
一旦删除precompiled_header.h.gch,gdb就会打印
func_A(): file.cpp at 5 <- OK!
func_B(): file.cpp at 10 <- OK!
main(): file.cpp at 14
我确信预编译的头和所有文件都使用相同的命令行标志集编译,并且确实找到并使用了这个预编译的头(使用-H选项检查)。没有启用任何优化。
该程序使用
编译-D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -Wno-unused -fexceptions -std = gnu ++ 0x-fPIC -Winvalid-pch -Wdisabled-optimization -Wuninitialized -Wsequence-point -Winit-self
gcc -v给出以下输出
使用内置规格。
目标:x86_64-linux-gnu
配置为:../ src / configure -v --with-pkgversion ='Ubuntu 4.4.3-4ubuntu5.1'--with-bugurl = file:///usr/share/doc/gcc-4.4 /README.Bugs --enable-languages = c,c ++,fortran,objc,obj-c ++ --prefix = / usr --enable-shared --enable-multiarch --enable-linker-build-id --with- system-zlib --libexecdir = / usr / lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir = / usr / include / c ++ / 4.4 --program-suffix = - 4.4 --enable-nls --enable-clocale = gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32 = i486 --with- tune = generic --enable-checking = release --build = x86_64-linux-gnu --host = x86_64-linux-gnu --target = x86_64-linux-gnu
线程模型:posix
gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5.1)
这里可能有什么问题?
答案 0 :(得分:3)
这是一个编译错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44550
它已在g ++ 4.5中修复,因此您应该升级编译器。
尽管如此,最好将预编译的头包含在cpp文件的第一行而不是h文件中,因为预编译的头包含需要位于编译单元的顶部。在您的情况下,每次包含头文件时都会包含它。此更改将阻止该错误影响您。