2009-09-12 9 views
8

Después de actualizar a Xcode 3.2 y Snow Leopard, mis compilaciones de depuración están rotas y fallan en tiempo de ejecución. Los Stringstreams no parecen funcionar. Funcionan en modo de lanzamiento.Creaciones de depuración C++ se rompieron en Snow Leopard Xcode

Lo he reducido a una combinación de GCC 4.2, OSX SDK 10.6 y el símbolo del preprocesador _GLIBCXX_DEBUG. Estos son los valores predeterminados para las nuevas configuraciones de Debug de los proyectos Xcode.

Este código muestra el problema:

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

La inserción stringstream debería funcionar, pero cuando se utiliza GCC 4.2 y _GLIBCXX_DEBUG, el operador '< <' lanza una excepción, y lo malo y se establecen fallar bits.

He intentado varias combinaciones de compilador y SDK con estos resultados: - El uso de GCC 4.2, LLVM-GCC o CLANG con SDK 10.6 NO funciona. - El uso de GCC 4.2, LLVM-GCC o CLANG con SDK 10.5 funciona. - El uso de GCC 4.0 con SDK 10.5 o 10.6 funciona.

Si _GLIBCXX_DEBUG está roto o no es compatible (con SDK 10.6 y GCC 4.2), ¿por qué es esto el predeterminado para las configuraciones de depuración en nuevos proyectos (línea de comandos C++)?

Respuesta

7

Modo de depuración de STL no es compatible en gcc 4.2 en este momento. Puede usar gcc 4.0 con el modo de depuración STL o eliminar las macros del preprocesador del modo de depuración de su configuración de depuración y seguir usando gcc 4.2.

+0

Por supuesto, ya GCC es de código abierto, se puede fijar siempre usted mismo – Crashworks

+0

Gracias, ¿Esto es solo para GCC de Apple? Funciona en otras plataformas con esta versión. Si no es compatible, ¿por qué es el valor predeterminado en XCode? ¿Apple documenta esto en cualquier lugar? – crmoore

+0

@cdespinosa, ¿Tiene alguna fuente donde dice que el modo de depuración de STL no es compatible?Además, probé esto con OSX Lion, y todavía no funciona. – highBandWidth

0

No olvide configurar cada objetivo si tiene muchos (tuve este problema) ya que la configuración de compilación del proyecto no sobrescribe la configuración de compilación de destino.

¡Realmente envié finalmente a encontrar para solucionar esto, estaba usando un XP VirtualMachine y Studio 2005 para evitar este problema!

2

Esto ahora es un error conocido y reportado en el compilador. Las únicas soluciones son:

  1. Quite las banderas como sugirió. Esto está bien, pero esas banderas son muy útiles a veces, y no desea eliminarlas de los proyectos y, una vez que se solucionó el error, ¡vuelva y actualícelas!

  2. Ejecute en modo de lanzamiento para probar hasta que realmente necesite los símbolos del depurador y luego quite temporalmente los indicadores.

he optado por # 2, de modo que cuando la solución sale, pero los proyectos no faltan las banderas. Para obtener más información, véase:

Apple Discussions

Por cierto, el código de la que tuve que tenían este problema era así de sencillo:

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