2012-03-23 3 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 

Обратите внимание, что есть только пять строк в заголовке.

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 -> Выполнить -> Ы: напечатает что-то вроде

.... 
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 iled с тем же набором флагов командной строки и что этот предварительно скомпилированный заголовок действительно найден и используется (отмечен параметром -H). Никакие оптимизации не включаются.

Программа составлена ​​с

-D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -Wno-неиспользованных -fexceptions -std = ГНУ ++ 0x-ППИЦ -Winvalid-PCH -Wdisabled-оптимизации -Wuninitialized -Wsequence точка -Winit-я

НКУ -v дает следующий вывод

Используя встроенные функции.

Цель: x86_64-Linux-гну

Настраивается с: ../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-check = release --build = x86_64-linux-gnu -host = x86_64-linux-gnu --target = x86_64-linux-gnu

0 модель

Тема: POSIX

GCC версии 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)

Что может быть не так?

ответ

3

Это ошибка компилятора: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44550

Это было исправлено в г ++ 4.5, поэтому вы должны обновить ваш компилятор.

Тем не менее, было бы лучше включить ваш предварительно скомпилированный заголовок в качестве первой строки файла cpp вместо h-файла, поскольку предварительное скомпилированное включение заголовка должно быть в верхней части блока компиляции. В вашем случае вы будете включать его каждый раз, когда вы включаете свой заголовочный файл. Это изменение остановит эту ошибку от вас.