2012-03-23 73 views
3

我正在调试使用GDB下的预编译头的项目。在检查崩溃堆栈跟踪时,我发现GDB输出正确的函数名称,但文件和行号信息不正确。错误的堆栈跟踪与GCC +预编译头

请看下面的例子:

file.h

#ifndef FILE_H_ 
#define FILE_H 
    #include "../precompiled_header.h" 

    void func_A(); 
    void func_B(); 
#endif //FILE_H 

注意,只有5在标题行。

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 

我确定预编译的头和所有文件都是comp使用相同的命令行标志集,并且这个预编译头部确实被找到并使用(使用-H选项进行检查)。没有优化打开。

的程序编译与

-D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -Wno非占线-fexceptions -std = GNU ++ 0x中-FPIC -Winvalid-PCH -Wdisabled优化-Wuninitialized -Wsequence点-Winit自

GCC -v给出了下面的输出

使用内置的规格。

目标:x86_64的-Linux的GNU

配置有:../src/configure -v --with-pkgversion = '的Ubuntu 4.4.3-4ubuntu5.1' --with-bugurl =文件: ///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)

出了什么问题吗?

回答

3

这是一个编译器错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44550

它被固定在G ++ 4.5,所以你应该升级你的编译器。

不过,最好将预编译头文件作为cpp文件的第一行而不是h文件,因为预编译头文件包含需要位于编译单元的顶部。就你而言,每次包含头文件时都会包含它。这种改变会阻止这个bug影响你。