C++: ostringstream problem im debug mode ?

  • C++: ostringstream problem im debug mode ?

    Kann es sein, dass im Debug-Modus ostringstream keine int Ausgaben mehr vornimmt?

    Folgendes Beispiel verhält sich unter Xcode 3.2 entsprechend unterschiedlich in Release oder Debug:

    C-Quellcode

    1. #include <iostream>
    2. #include <sstream>
    3. using namespace std;
    4. int main (int argc, char * const argv[]) {
    5. ostringstream os;
    6. os << 2 << ' ';
    7. cout << os.str() << " Hello, World!\n";
    8. return 0;
    9. }
    Alles anzeigen
    Noch ist es für mich ein Rätsel ...
    Dem 10x8-Schach gehört die Zukunft !
  • Da muss irgendwas komisch sein. Probier es mal auf der Kommandozeile.
    Ich habe jetzt nochmal
    gcc version 4.2.1 (Apple Inc. build 5566)
    und
    gcc version 4.4.0 20081219 (experimental) (GCC)
    versucht. Funktioniert immer wie erwartet. Kann man in Xcode nicht irgendwo nachschauen, mit welchen flags g++ aufgerufen wird?

    Vielleicht nimmt dein Setup auch die "2" als 64bit und ostringstream mag das nicht (will ich aber auch bezweifeln). Kannst ja trotzdem mal statt "2" explizit "short(2)" versuchen.
    C++
  • a) mit der Kommandozeile hab ich es nicht so, vertraue da der Entwicklungsumgebung.

    b) ob 32-Bit oder 64-Bit Kompilat spielt keine Rolle: das Verhalten ist gleich.

    c) (short) casten brachte leider auch nichts anderes.

    Offenbar wird der String-Stream komplett gesperrt, nachdem gescheitert ist, einen Integer auszugeben - etwa das nachfolgende Space ' ' wird ignoriert, wie alles, ganz gleich was danach noch auszugeben versucht würde.
    Dem 10x8-Schach gehört die Zukunft !
  • Nun, zurzeit bin ich leider von meinem Mac getrennt, es wird also dauern.

    Das Problem entdeckte ich, als ich gleiche Sourcen per Borland Turbo C++, diversen MS Visual Studio Versionen und Xcode (vom Snow-Leopard) kompilierte. Nur unter Xcode im Debug Modus tauchte dieser Wirrwarr auf. Nach viel zu viel Zeit konnte ich das Problem dann eingrenzen und auf obiges Mini-Beispiel reduzieren. Witzig ist, dass es mit der deprecated Klasse ostrstream noch klappte, wenn auch mit dem Hinweis auf eingebundene alte Include-Files. Ich gehe also momentan von einem Fehler in den neueren Bibliotheken aus. Es wäre gut, sicherzustellen, dass es nicht an mir selber liegt, insofern wäre ein Reproduktionsversuch auf anderen Xcode (Snowleopard Stand) Umgebungen hilfreich.
    Dem 10x8-Schach gehört die Zukunft !
  • a) Compile ...

    Quellcode

    1. CompileC build/Test.build/Debug/Test.build/Objects-normal/x86_64/main.o main.cpp normal x86_64 c++ com.apple.compilers.gcc.4_2
    2. cd /Users/rs/Documents/XProjects/TestA/Test
    3. setenv LANG en_US.US-ASCII
    4. /Developer/usr/bin/gcc-4.2 -x c++ -arch x86_64 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1 -isysroot /Developer/SDKs/MacOSX10.6.sdk -mfix-and-continue -fvisibility-inlines-hidden -mmacosx-version-min=10.6 -gdwarf-2 -iquote /Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/Test-generated-files.hmap -I/Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/Test-own-target-headers.hmap -I/Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/Test-all-target-headers.hmap -iquote /Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/Test-project-headers.hmap -F/Users/rs/Documents/XProjects/TestA/Test/build/Debug -I/Users/rs/Documents/XProjects/TestA/Test/build/Debug/include -I/Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/DerivedSources/x86_64 -I/Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/DerivedSources -c /Users/rs/Documents/XProjects/TestA/Test/main.cpp -o /Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/Objects-normal/x86_64/main.o

    b) Link ...

    Quellcode

    1. Ld build/Debug/Test normal x86_64
    2. cd /Users/rs/Documents/XProjects/TestA/Test
    3. setenv MACOSX_DEPLOYMENT_TARGET 10.6
    4. /Developer/usr/bin/g++-4.2 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -L/Users/rs/Documents/XProjects/TestA/Test/build/Debug -F/Users/rs/Documents/XProjects/TestA/Test/build/Debug -filelist /Users/rs/Documents/XProjects/TestA/Test/build/Test.build/Debug/Test.build/Objects-normal/x86_64/Test.LinkFileList -mmacosx-version-min=10.6 -o /Users/rs/Documents/XProjects/TestA/Test/build/Debug/Test

    c) Build Succeeded; No issues
    Dem 10x8-Schach gehört die Zukunft !
  • Test-Programm:

    C-Quellcode

    1. #include <iostream>
    2. #include <sstream>
    3. using namespace std;
    4. int main (int argc, char * const argv[]) {
    5. // insert code here...
    6. ostringstream os;
    7. os << '#' << (short)2 << ':';
    8. cout << os.str() << " Hello, World!\n";
    9. return 0;
    10. }
    Alles anzeigen
    Release:

    Quellcode

    1. #2: Hello, World!
    Debug:

    Quellcode

    1. # Hello, World!

    Es stirbt (ostringstring Ausgabe) im Debug bei der ersten Zahl-Ausgabe.
    Dem 10x8-Schach gehört die Zukunft !
  • Ich hab mal einen Bugreport gemacht und folgende Antwort erhalten

    Hi Dominik,

    This is a courtesy email regarding Bug ID# 7254418.

    Engineering has provided the following information:

    You can work around this issue by turning of the C++ runtime standard library debug mode in Xcode. This is the option that sets _GLIBCXX_DEBUG for the compiler.


    Hab allerdings noch nicht ausprobiert ob das auch tatsächlich funktioniert. Jedenfalls weiss Apple über das Problem bescheid.
    Gruss Dominik.
  • Aus dem Kontext der genannten Flag-Bezeichnung heraus kam mir folgende Idee: ich setzte die Compilerversion im Debug-Mode auf GCC 4.0 zurück. Und schon läuft es wieder. Irgendwie scheinen STL-Bezugnahmen im Debug-Mode unter der Compiler-Version GCC 4.2 zahlreiche, diverse Probleme zu verursachen.

    Macht es nun prinzipielle Probleme, die Release unter GCC 4.2 zu erstellen, jedoch unter GCC 4.0 zu debuggen? Es scheint mir eine Vertrauensfrage in die Qualität des GCC 4.2 zu sein. Kann mir hierzu jemand Mut machen?
    Dem 10x8-Schach gehört die Zukunft !