2012-03-23 13 views
3

GDBのプリコンパイル済みヘッダーを使用するプロジェクトをデバッグしています。クラッシュスタックのトレースを調べているうちに、GDBは正しい関数名を出力しますが、ファイルと行番号の情報は間違っています。以下の実施例でGCC +のプリコンパイル済みヘッダーでスタックトレースが正しくない

ルック:

ファイル.hヘッダにのみ5行があること

#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:GDBが

を印刷し、できるだけ早く私はprecompiled_header.h.gchを削除するよう

.... 
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 

のようなものを出力します

func_A(): file.cpp at 5 <- OK! 
func_B(): file.cpp at 10 <- OK! 
main(): file.cpp at 14 

私は、プリコンパイルされたヘッドとすべてのファイルがcomp同じコマンドラインフラグのセットでileされ、このプリコンパイルされたヘッダーが実際に見つけられ使用されます(-Hオプションでチェックされます)。最適化は有効になっていません。

、プログラムは

-D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -Wno-未使用-fexceptions -std = GNU ++ 0X-FPIC -Winvalid-PCH -Wdisabled最適化でコンパイルされ-Wuninitialized内蔵のスペックの使用次の出力

を与える-v -Wsequence点-Winit自己

GCC。

対象:x86_64版 - のlinux-gnuので構成

:--with-bugurl ../src/configure -v --with-pkgversion = 'Ubuntuの4.4.3-4ubuntu5.1' =ファイル: ///usr/share/doc/gcc-4.4/README.Bugs --enable-languages = c、C++、fortran、objc、obj-C++ --prefix =/usr --enable-shared --enable-multiarch - -libexecdir =/usr/lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir =/usr/lib// include/C++/4.4 --program-suffix = -4.4 --enable-nls --enable-clocale = gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror - -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で修正されています。

しかし、コンパイル済みヘッダーインクルードはコンパイル単位の先頭にある必要があるため、hファイルではなく、cppファイルの最初の行として、事前コンパイル済みヘッダーを含める方がよいでしょう。あなたのケースでは、ヘッダファイルをインクルードするたびにインクルードします。この変更により、バグが影響を受けることがなくなります。

関連する問題