2012-03-23 95 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影響你。