首页 文章

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

提问于
浏览
3

我正在调试一个在GDB下使用预编译头的项目 . 在检查崩溃堆栈跟踪时,我发现GDB打印了正确的函数名称,但文件和行号信息不正确 .

请看以下示例:

file.h

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

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

请注意, Headers 中只有五行 .

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 回答

  • 3

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

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

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

相关问题