Отладочные сборки C ++ сломались в Snow Leopard Xcode - PullRequest
8 голосов
/ 13 сентября 2009

После обновления до Xcode 3.2 и Snow Leopard мои отладочные сборки ломаются и дают сбой во время выполнения. Струнные потоки, похоже, не работают. Они работают в режиме Release.

Я сузил его до комбинации GCC 4.2, OSX SDK 10.6 и символа препроцессора _GLIBCXX_DEBUG. Это настройки по умолчанию для конфигураций отладки новых проектов Xcode.

Этот код показывает проблему:

#include <iostream>
#include <string>
#include <sstream>

int main (int argc, char * const argv[]) {

    std::stringstream stream;
    std::cout << "             expected  actual" << std::endl;
    std::cout << "stream.bad:  0         " << stream.bad() << std::endl;
    std::cout << "stream.fail: 0         " << stream.fail() << std::endl;
    std::cout << "stream.eof:  0         " << stream.eof() << std::endl;
    std::cout << "stream.good: 1         " << stream.good() << std::endl;

    stream.exceptions(std::ios::badbit | std::ios::failbit | std::ios::eofbit);
    try{
        stream << 11;       //< Does not work as expected (see output)
    }catch (std::bad_cast &e) {
        std::cout << "Unexpected bad_cast: " << e.what() << std::endl;
    }catch(std::exception &e){
        std::cout << "Unexpected exception: " << e.what() << std::endl;
    }

    std::cout << "             expected  actual" << std::endl;
    std::cout << "stream.bad:  0         " << stream.bad() << std::endl;
    std::cout << "stream.fail: 0         " << stream.fail() << std::endl;
    std::cout << "stream.eof:  0         " << stream.eof() << std::endl;
    std::cout << "stream.good: 1         " << stream.good() << std::endl;
    std::cout << std::endl;
    std::cout << "EXPECT: " << 11 << std::endl;
    std::cout << "ACTUAL: " << stream.str() << std::endl;

    std::cout << std::endl << "Done" << std::endl;
    return 0;
}

Вставка потока строк должна работать, но при использовании GCC 4.2 и _GLIBCXX_DEBUG оператор «<<» выдает исключение, и биты сбоя и сбоя устанавливаются. </p>

Я пробовал различные комбинации компилятора и SDK с этими результатами: - Использование GCC 4.2, LLVM-GCC или CLANG с SDK 10.6 НЕ работает. - Использование GCC 4.2, LLVM-GCC или CLANG с SDK 10.5 работает. - Использование GCC 4.0 с SDK 10.5 или 10.6 работает.

Если _GLIBCXX_DEBUG не работает или не поддерживается (с SDK 10.6 и GCC 4.2), то почему это по умолчанию для конфигураций отладки в новых проектах (командная строка C ++)?

Ответы [ 3 ]

7 голосов
/ 13 сентября 2009

Режим отладки STL в настоящее время не поддерживается в gcc 4.2. Вы можете использовать gcc 4.0 с режимом отладки STL или удалить макросы препроцессора режима отладки из конфигурации Debug и продолжать использовать gcc 4.2.

2 голосов
/ 07 октября 2010

Теперь это известная и сообщаемая ошибка в компиляторе. Единственные обходные пути:

  1. Снимите флажки, как вы предлагали. Это нормально, но эти флаги иногда очень полезны, и вы не хотите удалять их из проектов, и после исправления ошибки вернитесь и обновите их снова!

  2. Выполните в режиме выпуска для тестирования, пока вам действительно не понадобятся символы отладчика, а затем временно удалите флаги.

Я выбрал # 2, чтобы, когда исправление вышло, но проекты не пропускали флаги. Для получения дополнительной информации см .:

Обсуждения Apple

Кстати, код, который у меня был с этой проблемой, был просто так:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string firstName;
    string lastName;
    int age;
    char gender;

    cout << "Enter First Name: " << endl;
    cin >> firstName;  // <----- error happens right here

    cout << "Enter Last Name: ";
    cin >> lastName;

    cout << "Enter age: ";
    cin >> age;

    cout << "Enter gender: (m or f) ";
    cin >> gender;

    cout << firstName << lastName << age << gender;

    return 0;
}
0 голосов
/ 09 ноября 2009

Не забудьте настроить каждую цель, если у вас их много (у меня была эта проблема), поскольку конфигурация сборки projet не перезаписывает конфигурацию сборки цели.

Я действительно посланник, наконец-то выяснивший, как это исправить, я использовал XP VirtualMachine и Studio 2005, чтобы избежать этой проблемы!

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