Я отлаживаю проект, который использует предварительно скомпилированные заголовки в 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 -> run -> 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
Я уверен, что предварительно скомпилированная голова и все файлы скомпилированы с одинаковым набором флагов командной строки и что этот предварительно скомпилированный заголовок действительно найден и используется (проверяется с помощью -Н вариант).Оптимизация не включена.
Программа скомпилирована с
-D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -Wno-unused -fexceptions -std = gnfPIC -Winvalid-pch -Wdisabled-оптимизация -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 - без включенного-gettext --enable-threads = posix --with-gxx-include-dir= / usr / include / c ++ / 4.4 --program-суффикс = -4.4 --enable-nls --enable-clocale = gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc -disable-werror --with-arch-32 = i486 --with-tune = универсальный --enable-check = release --build = x86_64-linux-gnu --host = x86_64-linux- gnu --target = x86_64-linux-gnu
Модель потока: версия posix
gcc4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
Что здесь может быть не так?