2009-09-12 17 views
8

Xcode 3.2とSnow Leopardにアップグレードした後、デバッグビルドが壊れて実行時に失敗します。ストリングストリームは機能していないようです。彼らはリリースモードで動作します。Snow Leopard XcodeでC++デバッグビルドが壊れた

私は、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; 
} 

にstringstream挿入が動作するはずが、しかし、GCC 4.2と_GLIBCXX_DEBUGを使用する場合、「< <」演算子は例外をスローし、不良とフェイルビットが設定されています。

コンパイラとSDKのさまざまな組み合わせを試しました。 - GCC 4.2、LLVM-GCC、またはCLANGをSDK 10.6で使用すると動作しません。 - GCC 4.2、LLVM-GCC、またはSDK 10.5のCLANGを使用すると機能します。 - GCC 4.0をSDK 10.5または10.6で使用すると動作します。

_GLIBCXX_DEBUGが壊れているかサポートされていない場合(SDK 10.6およびGCC 4.2)、なぜ新しいプロジェクト(C++コマンドライン)のデバッグ設定のデフォルトですか?

答えて

7

STLデバッグモードは、現時点ではgcc 4.2ではサポートされていません。 gcc 4.0をSTLデバッグモードで使用するか、デバッグモードプリプロセッサマクロをデバッグ設定から削除し、gcc 4.2を使用し続けることができます。

+0

、GCCは、オープンソースであるため、いつでも修正することができますがあなた自身。 – Crashworks

+0

ありがとう、 AppleのGCC専用ですか?このバージョンの他のプラットフォームでも動作します。 サポートされていない場合は、XCodeのデフォルトはなぜですか? Appleはどこに文書化していますか? – crmoore

+0

@cdespinosa、STLデバッグモードがサポートされていないと言ったソースがありますか?また、私はOSX Lionでこれを試しましたが、それでも動作しません。 – highBandWidth

0

プロジェトビルド設定がターゲットビルド設定を上書きしないので、多くの場合(この問題があった場合)は、各ターゲットを設定することを忘れないでください。

この問題を回避するために、私はXP VirtualMachineとStudio 2005を使用していました。

2

これは現在、コンパイラの既知の報告されたバグです。唯一の回避策は次のとおりです。

  1. 推奨するフラグを削除します。これは問題ありませんが、これらのフラグは非常に便利なので、プロジェクトから削除したくない場合や、バグが修正されてから再度更新してください。

  2. デバッガシンボルが本当に必要になるまでテスト用のリリースモードで実行して、フラグを一時的に削除します。

私は#2を選んだので、修正が出てもプロジェクトにフラグがないわけではありません。詳細については、以下を参照してください

ところで

Apple Discussions

、私はこの問題はちょうどこの簡単だった持っていたコード:もちろん

#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; 
} 
関連する問題