2009-09-12 12 views
8

Po aktualizacji do Xcode 3.2 i Snow Leopard, moje kompilacje debugowania są uszkodzone i kończą się niepowodzeniem. Stringstreamy nie działają. Działają w trybie Release.C++ Budowanie debugowania zepsuło się w Snow Leopard Xcode

Zawęziłem to do kombinacji GCC 4.2, OSX SDK 10.6 i symbolu pre-procesora _GLIBCXX_DEBUG. Są to ustawienia domyślne dla nowych konfiguracji debugowania projektów Xcode.

Kod ten przedstawia problem:

#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; 
} 

Wprowadzenie stringstream powinny pracować, a przy użyciu GCC 4.2 i _GLIBCXX_DEBUG operator „< <” zgłasza wyjątek i złe i ustawione są odporne na uszkodzenia bitów.

Próbowałem różnych kombinacji kompilatora i SDK z tymi wynikami: - Używanie GCC 4.2, LLVM-GCC lub CLANG z SDK 10.6 NIE działa. - Działa za pomocą GCC 4.2, LLVM-GCC lub CLANG z SDK 10.5. - Używanie GCC 4.0 z wersją SDK 10.5 lub 10.6.

Jeśli _GLIBCXX_DEBUG jest zepsuty lub nie jest obsługiwany (z SDK 10.6 i GCC 4.2), to dlaczego jest to ustawienie domyślne dla konfiguracji debugowania w nowych projektach (linia poleceń C++)?

Odpowiedz

7

Tryb debugowania STL nie jest obecnie obsługiwany w gcc 4.2. Możesz użyć gcc 4.0 z trybem debugowania STL lub usunąć makra preprocesora trybu debugowania z konfiguracji Debugowania i dalej używać gcc 4.2.

+0

Oczywiście, ponieważ GCC jest open source, zawsze można naprawić samemu. – Crashworks

+0

Dzięki, Czy jest to tylko GCC firmy Apple? Działa na innych platformach z tą wersją. Jeśli nie jest obsługiwany, to dlaczego jest on domyślny w XCode? Czy Apple dokumentuje to w dowolnym miejscu? – crmoore

+0

@cdespinosa, czy masz jakieś źródło, w którym jest napisane, że tryb debugowania STL nie jest obsługiwany.Ponadto próbowałem tego z OSX Lion i nadal nie działa. – highBandWidth

0

Nie zapomnij skonfigurować każdego celu, jeśli masz wiele (miałem ten problem), ponieważ konfiguracja budowania projet nie zastępuje docelowej konfiguracji kompilacji.

Naprawdę wysłannik w końcu dowiedziałem się, aby to naprawić, korzystałem z XP VirtualMachine i Studio 2005, aby uniknąć tego problemu!

2

Jest to obecnie znany i zgłoszony błąd w kompilatorze. Jedyne obejścia to:

  1. Usuń flagi zgodnie z sugestią. Jest to w porządku, ale te flagi są bardzo przydatne, a nie chcesz ich usuwać z projektów i po naprawieniu błędu wróć i zaktualizuj je ponownie!

  2. Wykonaj w trybie zwolnienia do testowania, aż naprawdę potrzebujesz symboli debuggera, a następnie tymczasowo usuń flagi.

Wybrałem # 2, aby po wyjściu poprawki pojawiły się projekty, w których brakuje flag. Aby uzyskać więcej informacji, patrz:

Apple Discussions

BTW, kod ten, który miałem, który miał ten problem właśnie ta prosta:

#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; 
} 
Powiązane problemy