C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problem nach Update von GCC 3.3.1 auf 3.4.2

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Edzard Egberts
Guest





PostPosted: Wed Feb 01, 2006 3:43 pm    Post subject: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote



Hallo,

nach dem Update bleibt mir der Debugger jetzt plötzlich ständig mit
einem SIGTRAP im Destructor von std::string stehen. Unter Windows
bedeutet das, dass ein korrupter Heap erkannt wurde, aber ich habe nicht
den leisesten Schimmer, wo der plötzlich herkommt - besonders wo der
Fehler in allen meinen aktuellen Programmen auftritt (7 Stück). Ohne
Debugger läuft alles problemlos durch und mangels Absturz wäre ich
eigentlich nicht auf die Idee gekommen, dass da irgendetwas nicht
stimmt. ;o(

Ist hier jemand, dem so etwas auch schon passiert ist, mit einem
Hinweis, welche Fehler GCC 3.4.2 im Gegensatz zum 3.3.1 erkennt (oder
macht ;o)? Das Unangenehme an diesem Problem ist ja leider, dass der
Fehler nicht da gemacht wurde, wo er erkannt wird...

Danke,

Ed

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Daniel Albuschat
Guest





PostPosted: Wed Feb 01, 2006 7:01 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote



Edzard Egberts wrote:
Quote:
Ich habe das Problem gefunden und benutze erstmal wieder GCC 3.3.1:

Meine Programme verwenden eine DLL mit der Funktion

DLLAPI void rd_str(istream& In, string& Str)
{
std::getline(In, Str, '\0');
}

Wie ist DLLAPI denn definiert?

MfG,
Daniel

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Edzard Egberts
Guest





PostPosted: Wed Feb 01, 2006 7:01 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote



Ich habe das Problem gefunden und benutze erstmal wieder GCC 3.3.1:

Meine Programme verwenden eine DLL mit der Funktion

DLLAPI void rd_str(istream& In, string& Str)
{
std::getline(In, Str, '\0');
}

Sobald ich diese Funktion irgendwo verwende, bekomme ich den SIGTRAP,
wenn ich statt dessen direkt std::getline(In, Str, '\0'); einsetze,
funktioniert die Sache. Andere Funktionen werden aber korrekt exportiert
(wobei rd_str() größtenteils innerhalb der DLL verwendet wird und dabei
auch den SIGTRAP hervorruft).
Einen Seiteneffekt glaube ich ausschließen zu können, ich habe mir
nämlich eine DLL mit dieser Funktion gebaut und dazu ein
Minimalprogramm, das diese Funktion verwendet, um mit fstream einen
string zu schreiben und wieder einzulesen - genau das gleiche Ergebnis.
Komische Sache, stehe völlig auf dem Schlauch - da kann ich doch
eigentlich nichts mehr falsch gemacht haben?

Ed

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Olaf Krzikalla
Guest





PostPosted: Wed Feb 01, 2006 8:02 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Hi,

Edzard Egberts wrote:
Quote:
Meine Programme verwenden eine DLL mit der Funktion

DLLAPI void rd_str(istream& In, string& Str)
{
std::getline(In, Str, '\0');
}

Sobald ich diese Funktion irgendwo verwende, bekomme ich den SIGTRAP,
Ziemlich sicher ein Allokator-Problem. Dem String wird in der DLL

irgendwie Speicher zugeteilt. Der aber kommt aus irgendeinem Grund von
einem vom Hauptprogramm verschiedenen Heap. Wenn das Hauptprogramm dann
später den String destruieren will, operiert das delete auf einem
anderen als dem erwarteten Heap.

Schreib einfach mal eine Funktion:

DLLAPI void test (std::vector<char>& bla)
{
bla.resize (1000);
}

in Deine DLL. Wenn das Hauptprogramm beim Destruieren des Vectors genau
so aussteigt, weißt Du, wo Du suchen mußt.


MfG
Olaf Krzikalla

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Edzard Egberts
Guest





PostPosted: Wed Feb 01, 2006 10:01 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Hallo,

Quote:
Schreib einfach mal eine Funktion:
in Deine DLL. Wenn das Hauptprogramm beim Destruieren des Vectors genau
so aussteigt, weißt Du, wo Du suchen mußt.

Den Vector zerstört das Programm einwandfrei, das ist scheinbar nicht so
global. Dafür habe ich in meinem Testprogramm dem String mit "reserve"
mal etwas Speicher spendiert und dann bleibt es nicht mehr stehen. Am
getline() liegt es auch nicht - gleiches Ergebnis, wenn ich getline()
durch eine read()-Schleife ersetze. Der SIGTRAP tritt aber tatsächlich
im delete des Strings auf.

Ich habe jetzt mal auf die falsche Taste gedrückt und den Debugger
weiter laufen lassen und siehe da - das Programm lief tatsächlich
weiter! Wenn ich es direkt ohne Debugger starte, läuft es auch ohne
Fehler durch. Ich habe also scheinbar gar kein Problem mit der
Programmerstellung, sondern mit dem Debugger, der wohl an einer
SIGTRAP-Halluzination leidet. GDB 5.2.1 und 6.0 verhalten sich da
gleich. Nach einem echten SIGTRAP im Destruktor dürfte das Programm
eigentlich nicht mehr weiterlaufen, oder sehe ich das falsch?

Damit das auch nicht an meiner Eclipse-IDE liegen kann, habe ich den gdb
jetzt mal solo gestartet und wurde zusätzlich zum SIGTRAP mit der
"warning: Invalid Adress specified to RtlFreeHead( 003D0000, 0045C0A0 )"
belohnt. Beim eintippen von "continue" macht er "Continuing" und
schließlich "Program exited normally". Das kann doch eigentlich nicht
wahr sein, oder?

Gruß,

Ed

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Edzard Egberts
Guest





PostPosted: Wed Feb 01, 2006 10:01 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Quote:
Wie ist DLLAPI denn definiert?

Naja, genau so, wie es unter GCC 3.3.1 einwandfrei funktioniert, alle
anderen Funktionen und Klassen einwandfrei exportiert und BUILD_DLL ist
für die DLL auch korrekt definiert. Um zwischen 3.3.1 und 3.4.2 zu
wechseln, muß ich nur ein Verzeichnis immer wieder umbenennen, also von
MinGW_3.3.1 auf MinGW, bzw. von MinGW_3.4.2 auf MinGW.

Deine Frage beantworte ich natürlich auch noch: ;o)

#ifndef DLLAPI_H
# define DLLAPI_H
# ifdef BUILD_DLL
# define DLLAPI __declspec( dllexport )
# else
# define DLLAPI __declspec( dllimport )
# endif
#endif

Also daran kann es nun wirklich nicht liegen.

Gruß,

Ed

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Daniel Albuschat
Guest





PostPosted: Wed Feb 01, 2006 10:01 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Olaf Krzikalla wrote:

Quote:
Ziemlich sicher ein Allokator-Problem. Dem String wird in der DLL
irgendwie Speicher zugeteilt. Der aber kommt aus irgendeinem Grund von
einem vom Hauptprogramm verschiedenen Heap. Wenn das Hauptprogramm dann
später den String destruieren will, operiert das delete auf einem
anderen als dem erwarteten Heap.

Kannst du das evtl. ein wenig genauer ausfuehren? Welche Operation von
`delete' wird dort von falschen Tatsachen ausgehen und das Fehlverhalten
verursachen?

Ich habe irgendwie Schwierigkeiten, das nachzuvollziehen...
Was natuerlich an meinem Halbwissen liegt, das ich gerne ausbauen
wuerde. ;)

MfG,
Daniel

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stefan Reuther
Guest





PostPosted: Wed Feb 01, 2006 11:59 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Edzard Egberts wrote:
Quote:
Ich habe das Problem gefunden und benutze erstmal wieder GCC 3.3.1:

Meine Programme verwenden eine DLL mit der Funktion

DLLAPI void rd_str(istream& In, string& Str)
{
std::getline(In, Str, '\0');
}

Sobald ich diese Funktion irgendwo verwende, bekomme ich den SIGTRAP,
wenn ich statt dessen direkt std::getline(In, Str, '\0'); einsetze,
funktioniert die Sache. Andere Funktionen werden aber korrekt exportiert
(wobei rd_str() größtenteils innerhalb der DLL verwendet wird und dabei
auch den SIGTRAP hervorruft).

Vergleiche den generierten Assemblercode, vielleicht fällt da was auf.
Überprüfe, wie die Standardbibliothek gelinkt wird (statisch? dynamisch?
korrekte Version in DLL und EXE?). Wenn die DLL eine andere Version der
Standardbibliothek nutzt als die EXE könnte es Probleme geben.

Du solltest auch mal in einer Windows-Newsgroup fragen. Während sich
unter *ix die Shared Libraries schön intuitiv, wie normale Libraries,
bestehend aus compilierten C++-Übersetzungseinheiten, benehmen, haben
DLLs in Windows wohl etwas andere Eigenschaften, zu denen man dir dort
mehr sagen kann. Ich linke, weil ich mich mit DLLs nicht auskenne, unter
Windows immer statisch :->


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Daniel Albuschat
Guest





PostPosted: Thu Feb 02, 2006 10:00 am    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Edzard Egberts wrote:
Quote:

Wie ist DLLAPI denn definiert?

Naja, genau so, wie es unter GCC 3.3.1 einwandfrei funktioniert, alle
anderen Funktionen und Klassen einwandfrei exportiert und BUILD_DLL ist
für die DLL auch korrekt definiert. Um zwischen 3.3.1 und 3.4.2 zu
wechseln, muß ich nur ein Verzeichnis immer wieder umbenennen, also von
MinGW_3.3.1 auf MinGW, bzw. von MinGW_3.4.2 auf MinGW.

Deine Frage beantworte ich natürlich auch noch: ;o)

#ifndef DLLAPI_H
# define DLLAPI_H
# ifdef BUILD_DLL
# define DLLAPI __declspec( dllexport )
# else
# define DLLAPI __declspec( dllimport )
# endif
#endif

Also daran kann es nun wirklich nicht liegen.

Nunja, es haette sein koennen, dass mit DLLAPI eine andere
Aufrufkonvention definiert wird, als du im Hauptprogramm benutzt.
Das waere eine moegliche Fehlerquelle.

MfG,
Daniel

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Florian Weimer
Guest





PostPosted: Thu Feb 02, 2006 1:02 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

* Edzard Egberts:

Quote:
Ich habe das Problem gefunden und benutze erstmal wieder GCC 3.3.1:

Meine Programme verwenden eine DLL mit der Funktion

DLLAPI void rd_str(istream& In, string& Str)
{
std::getline(In, Str, '\0');
}

Sobald ich diese Funktion irgendwo verwende, bekomme ich den SIGTRAP,

Sind Programme und DLL mit derselben GCC-Version kompiliert worden?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Edzard Egberts
Guest





PostPosted: Thu Feb 02, 2006 6:03 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Hallo,

Quote:
Vergleiche den generierten Assemblercode, vielleicht fällt da was auf.

Mir wird da wohl kaum etwas auffallen. ;o)

Quote:
Überprüfe, wie die Standardbibliothek gelinkt wird (statisch? dynamisch?
korrekte Version in DLL und EXE?). Wenn die DLL eine andere Version der
Standardbibliothek nutzt als die EXE könnte es Probleme geben.

Das kann ich ausschließen, die werden beide im gleichen clean build
erzeugt. Ich habe gerade noch einmal ein Minimalprojekt erstellt, mit
einer DLL, die nur meine Problemfunktion enthält und exportiert und
einem Programm, das diese Funktion einsetzt. Außerdem habe ich mal nach
der Fehlermeldung gesucht (das Problem ist scheinbar recht verbreitet)
und mir den gdb 6.3 heruntergeladen, weil da irgendwo stand, das würde
ab 6.1 klappen:
Immer noch das gleiche Ergebnis - SIGTRAP im Destruktor. An meiner
Software oder der Umgebung kann das nun definitiv nicht mehr liegen,
sondern da stimmt etwas mit dem GCC 3.4.2 oder eher noch der
String-Implementierung nicht (weil der Vector keine Speicherprobleme
hat) und fertig.

Ich mache jetzt einfach mit dem 3.3.1 weiter - der ist zwar langsamer
und hat einen anderen Fehler, aber diesen Fehler habe ich im Griff. Ich
wollte vor allem sicher gehen, dass meine Software kein Ei enthält (da
sollte eigentlich heute das erste Release an einen Kunden herausgehen -
dieses Problem hat mich ganz schön genervt!), aber da bin ich mir jetzt
sicher! Mit dem 3.3.1 klappt mein Testprogramm nämlich direkt wieder
einwandfrei.

Quote:
Du solltest auch mal in einer Windows-Newsgroup fragen.
Ich linke, weil ich mich mit DLLs nicht auskenne, unter
Windows immer statisch :-

LOL, da könnte ich mir dann ja selber antworten. Surprised)

Falls es noch jemanden interessiert hier mein "Minimalprojekt" -
Seiteneffekte kann ich da ja wohl sicher ausschließen. ;o)

Gruß,

Ed

- dll_api.h -----------------------------------------
#ifndef DLLAPI_H
# define DLLAPI_H
# ifdef BUILD_DLL
# define DLLAPI __declspec( dllexport )
# else
# define DLLAPI __declspec( dllimport )
# endif
#endif

- Die Dll: rd_str.h ---------------------------------
#ifndef RD_STR_H_
#define RD_STR_H_

#include "dllapi.h"
#include <string>
using std::string;
#include <iostream>
using std::istream;
using std::ostream;

DLLAPI void rd_str(istream& In, string& Str);
// Nullterminierten String aus Stream lesen

DLLAPI void wr_str(ostream& Out, const string& Str);
// Standardstring nullterminiert auf Stream schreiben

#endif /*RD_STR_H_*/

- Die Dll: rd_str.cpp ---------------------------------
#include "rd_str.h"

DLLAPI void rd_str(istream& In, string& Str)
{
std::getline(In, Str, '\0');
}

DLLAPI void wr_str(ostream& Out, const string& Str)
{
Out << Str << std::ends;
}

- main.cpp --------------------------------------------
#include <rd_str.h>
#include <fstream>
using namespace std;

int main (int argc, char *argv[])
{
fstream Out("c:\\temp\\test.txt", ios_base::out | ios_base::binary);
wr_str(Out, "Testausgabe vom Ed");
Out.close();

fstream In("c:\\temp\\test.txt", ios_base::in | ios_base::binary);
string Str;
rd_str(In, Str); // <<< da krachts
In.close();
return 0;
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stefan Reuther
Guest





PostPosted: Thu Feb 02, 2006 8:02 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Edzard Egberts wrote:
Quote:
Überprüfe, wie die Standardbibliothek gelinkt wird (statisch? dynamisch?
korrekte Version in DLL und EXE?). Wenn die DLL eine andere Version der
Standardbibliothek nutzt als die EXE könnte es Probleme geben.

Das kann ich ausschließen, die werden beide im gleichen clean build
erzeugt.

Okay. Das ist unter Linux mein Standardproblem: .o aus verschiedenen
g++-Generationen passen nicht zueinander.

Quote:
An meiner
Software oder der Umgebung kann das nun definitiv nicht mehr liegen,
sondern da stimmt etwas mit dem GCC 3.4.2 oder eher noch der
String-Implementierung nicht (weil der Vector keine Speicherprobleme
hat) und fertig.

Dein Projekt funktioniert bei mir mit folgender Kommandozeile (keine
Ahnung, ob das die empfohlene Vorgehensweise ist, wie gesagt, von DLLs
unter Windows hab ich nicht so die Ahnung):

$ c:\mingw\bin\g++ -shared -DBUILD_DLL -o io.dll rd_str.cpp
$ c:\mingw\bin\g++ -I. -o main.exe main.cpp io.dll
$ c:\mingw\bin\g++ --version
g++ (GCC) 3.4.2 (mingw-special)

Wenn ich testweise in deine main hinten noch eine Ausgabe anfüge
std::cout << "am Ende " << Str.size() << std::endl;
wird diese auch korrekt ausgeführt.

Wobei mir noch was einfällt (eigentlich die Standard-gcc-Fehlesuche-
Anweisung): übersetze mal mit -v, und schaue, dass da nichts irgendwie
auf Bibliotheken fremder Versionen verweist. Bei mir zeigt das jede
Menge Pfade mit '3.4.2' drin.

Quote:
Du solltest auch mal in einer Windows-Newsgroup fragen.
Ich linke, weil ich mich mit DLLs nicht auskenne, unter
Windows immer statisch :-

LOL, da könnte ich mir dann ja selber antworten. Surprised)

Blieben noch die GNU-Gruppen für gcc-spezifische Fehlersuche.
Andererseits kann es auch hier bleiben, so überlaufen ist hier nicht.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Edzard Egberts
Guest





PostPosted: Thu Feb 02, 2006 11:01 pm    Post subject: Re: Problem nach Update von GCC 3.3.1 auf 3.4.2 Reply with quote

Hallo Stefan,

Quote:
Wobei mir noch was einfällt (eigentlich die Standard-gcc-Fehlesuche-
Anweisung): übersetze mal mit -v, und schaue, dass da nichts irgendwie
auf Bibliotheken fremder Versionen verweist.

hey, da kommen wir der Sache näher, das erzählt irgend etwas von
multiple definition! Warum lässt sich das nicht in eine Datei umleiten?
Mit anderen Befehlen wie dir oder ls geht das. ;o(
Na gut, dann schreibe ich mal etwas von der Ausgabe ab:
"
main.exe(.text+0x270):locale-misc-inst.cc: multiple definition of
'mainCRTStartup'
c:/mingwstudio/mingw/bin/../lib/gcc/mingw32/3.4.2/../../../crt2.o(.text+0x270):crt1.c:
first defined here
main.exe(.text+0x290):locale-misc-inst.cc:multiple definition of
'WinMainCRTStartup'
c:/mingwstudio/mingw/bin/../lib/gcc/mingw32/3.4.2/../../../crt2.o(.text+0x290):crt1.c:
first defined here
"
So geht das dann weiter für 'atexit', '_onexit' und noch ein paar andere
Funktionen.

Nur was sollte mir das sagen? Müßte da nicht noch irgendwo ein "second
defined here" angegeben werden, um wirklich hilfreich zu sein? Ich sehe
nur "3.4.2" und nichts, was mir irgendwie doppelt vorkäme. "crt" ist
bestimmt "C-Runtime" und "locale-misc-inst.cc" scheint zur libstdc++ zu
gehören - das passt schon wieder zu meiner Aussage "das muß der String
sein!". Habe ich hier einen Konflikt zwischen LibC und LibStdC++?

Quote:
Blieben noch die GNU-Gruppen für gcc-spezifische Fehlersuche.
Andererseits kann es auch hier bleiben, so überlaufen ist hier nicht.

*g* so lange ich noch LibStdC++ irgendwo im Text unterbringen kann,
müßte das ja passen. ;o)

Gruß,

Ed

! Anmerkung des Moderators:
! Weitere gcc-spezifische Diskussion bitte wirklich in eine gcc-Gruppe
! umleiten.
! Übrigens: ISO C++ kennt keine libStdC++ ..

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.