使用GCC +预编译头的堆栈跟踪不正确

时间:2012-03-23 14:23:41

标签: gcc precompiled-headers

我正在调试一个在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)

这里可能有什么问题?

1 个答案:

答案 0 :(得分:3)

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

它已在g ++ 4.5中修复,因此您应该升级编译器。

尽管如此,最好将预编译的头包含在cpp文件的第一行而不是h文件中,因为预编译的头包含需要位于编译单元的顶部。在您的情况下,每次包含头文件时都会包含它。此更改将阻止该错误影响您。