Неправильная трассировка стека с предварительно скомпилированным заголовком GCC + - PullRequest
3 голосов
/ 23 марта 2012

Я отлаживаю проект, который использует предварительно скомпилированные заголовки в 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)

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

1 Ответ

3 голосов
/ 25 апреля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...