An invalid argument was encountered ?
-
Hallo,
ich habe auf einigen wenigen Computern das Problem, das meine MFC Anwendung ein
"An invalid argument was encountered"
Nach dem Start anzeigt. Diese Meldung habe ich aber nicht programmiert.
Das Problem tritt nur in der "Release" Version auf.
Und es tritt auch nicht auf meinem Rechner auf, nur auf anderenIm Internet findet man dazu recht spärliche Hinweise, das es an falschen
Eintragungen in der Release Eigenschaften liegen soll. Anscheinend etwas mit
dem generieren der Debug Informationen.Hat hier auch schon jemadn so etwas behoben / gesehen ?
Grüße
TheNoName
-
Das ist die Standardmeldung der MFC Exception Klasse CInvalidArgException.
Das kann viele verschiedene Ursachen haben.Die meisten Probleme der Art "debug geht, release geht nicht" kommen daher dass man vergessen hat Variablen zu initialisieren. Speziell BOOLs oder bools die auf "true" initialisiert gehören. In Debug Builds macht der MSVC bzw. der Debug Heap alles was nicht initialisiert wurde mit bestimmten Mustern voll die natürlich alle nicht 0 sind. Im überwiegenden grossteil aller Fälle wo man etwas vergessen hat zu initialisieren hilft das ungemein, da man den Fehler viel schneller findet (weils in der Debug Version dann sofort knallt). In einigen wenigen Fällen ist es leider genau umgekehrt.
-
Dazu zwei Fragen:
1. Wenn ein bool 1 oder 0 ist, ist mir das wurscht, das seh ich ja dann wenn es falsch ist aber warum kommt die Meldung in der Laufzeit, das es nicht initialisiert wurde? Ich mein, woher will er wissen, das der Speicherplatz nicht initialisiert ist ?
2. Warum nur bei manchen Rechnern
Gruß
thenoname
-
Typischerweise wird diese Exception geworfen wenn eine CRT Funktion mit den errno's EINVAL und ERANGE ausgeht.
-
Hi,
mal abgesehen von der Tatsache, das ich nicht weiss wie/woher du das erfahren hast:
Ein atoi(string) könnte z.B. ein ERANGE zurückwerfen.
Nur denke ich doch mal, das es von den Kompileroptionen abhängt, ob ich diese
Exception dann boxed anzeigen lasse.Kurz um: ich möchte wissen, wie ich die Debug Version so verstellen kann, damit ich auch dort solche Meldungen angezeigt bekomme.
Gruß
TheNoName
-
thenoname schrieb:
mal abgesehen von der Tatsache, das ich nicht weiss wie/woher du das erfahren hast:
Du hst den MFC Source Code! Also kanst Du doch nach sehen wo CInvalidArgException genutzt wird.
Dann wirst Du schnell merken, dass die MFC eine Funktion hat die AfxThrowInvalidArgException heißt.
Diese Funktion wird 1000nde Male benutzt.thenoname schrieb:
Ein atoi(string) könnte z.B. ein ERANGE zurückwerfen.
<Stöhn> Nein!
Die CRT Funktionen sind C! Die werfen nie eine Exception. Wenn aber eine MFC Funktion die CRT benutzt und etwas schief geht, und die ERANGE liefert, dann wird AfxThrowInvalidArgException aufgerufen.
(siehe z.b. AfxCrtErrorCheck)thenoname schrieb:
Nur denke ich doch mal, das es von den Kompileroptionen abhängt, ob ich diese
Exception dann boxed anzeigen lasse.Ganz und gar nicht. Das die Exception auftritt liegt (wie schon gesagt) evtl. an einr faslch initialisierten Variable, dann wird eben ein falsches Argeumen übergeben)
thenoname schrieb:
Kurz um: ich möchte wissen, wie ich die Debug Version so verstellen kann, damit ich auch dort solche Meldungen angezeigt bekomme.
Gar nicht! Du kanst aberbei der Release Option Debug Symbole erzeugen lassen und dann die Release Version debuggen!
-
Zusatz zum letzten Satz von Martin: du kannst auch in der Release Version zusätzlich die Optimierungen ausschalten, dann tut man sich viel viel leichter beim "durchsteppen".
Warum nur bei manchen Rechnern: weil der Speicher eben nicht initialisiert wurde. Das ist QUASI Zufall was da drinsteht. Es ist aber kein "echter" Zufall, und daher kann es passieren dass es auch einigen PCs immer zu funktionieren scheint.
Wenn ein bool 1 oder 0 ist, ist mir das wurscht, das seh ich ja dann wenn es falsch ist aber warum kommt die Meldung in der Laufzeit, das es nicht initialisiert wurde?
Vermutlich hast du nicht verstanden was ich geschrieben habe.
-
Also kanst Du doch nach sehen wo CInvalidArgException genutzt wird.
Dann wirst Du schnell merken, dass die MFC eine Funktion hat die AfxThrowInvalidArgException heißt.
Diese Funktion wird 1000nde Male benutzt.Ja, wenn man weiss, das es CInvalidArgException ist, nachdem man sucht.
Ihr wollt mir also erklären, das NUR MFC solchige MessageBoxen werfen kann, also
sozusagen alle Komponenten ala Slider oder STATIC. Alles was sonst in meinem Code
steht würde diese Meldung nicht verursachen.Gar nicht! Du kanst aberbei der Release Option Debug Symbole erzeugen lassen und dann die Release Version debuggen!
Naja das ist ja mein Problem. Ohne den Fehler brauch ich nicht debuggen. Wenn es so vom Speicherzustand abhängt müsste ja quasi der Rechner, auf dem es nicht funktioniert einen Hardwareunterschied (anderen Speichercontroller) haben.
Das Merkwürdige schreib ich hier gerne nochmal:
Mein Rechner sowie zig andere zeigen den Fehler nicht mal "zufällig" irgend wann.
Zwei andere Rechner hingegen zeigen das zuverlässig bei jedem Aufruf.Als Fazit werde ich jetzt mal alle MFC Aufrufe abklappern und schauen wo es evtl. nicht initialisiert wurde.
Gibt es einen Befehl, den man vor eine Variable setzen kann, die überprüft ob diese initialisiert wurde?Eigentlich dachte ich, das man die Debugversion im Kompiler schärfer einstellen kann, sodass alle nicht initialisierten Variablen sofort einen Break hervorrufen oder eine Warn-Meldung verursachen = Warnstufen. Damit könnte ich vorbeugen.
-
Eigentlich dachte ich, das man die Debugversion im Kompiler schärfer einstellen kann, sodass alle nicht initialisierten Variablen sofort einen Break hervorrufen oder eine Warn-Meldung verursachen = Warnstufen. Damit könnte ich vorbeugen.
Ja das wäre wirklich hilfreich. Du kannst für $$$ Tools wie BoundsChecker kaufen, BoundsChecker kann das IIRC.
Ansonsten kannst du in der Debugversion "manuell" nach bestimmten Patterns wie 0xDDDDDDDD, 0xFDFDFDFD oder 0xCDCDCDCD ausschau halten. Wenn du sowas in irgendeiner Variable findest ist es sehr wahrscheinlich dass sie nicht initialisiert wurde.
-
Ich hab mir das wesentlich primitiver vorgestellt:
Wenn irgendwo:
int myinteger;
steht sollte eine Compiler Warnung kommen:
Warning 0815: Du Depp schaffst eh keine richtige Initialisierung, also schreib gleich int myinteger=0;
Gruß
TheNoName
-
VC-2005 bzw. VC-2008 kann solch eine Warnung ausgeben...
int i,j,k; k = i*j;
Liefert bei mir
warning C4700: uninitialized local variable 'i' used
warning C4700: uninitialized local variable 'j' used
-
Wie ich es mir gedacht habe:
Einige schalten auf Warnstufe 4 /W4,
andere schalten alle Ausnahmen Erkennungen der Debug Version ein.Das hat dazu geführt, das ich viele nicht benutzte Variablen los bin
Und einige initialisiert habe.
Bei den Ausnahmen fand ich eine Stelle, wo "Throw_String" verwendet wurde.
Das ist also eine Art selbsterzeugte Meldung, nehme ich an.
Kann sowas in einer AFX Exception Meldung enden? Ich denke nicht.Naja, mal sehen ob das jetzt was gebracht hat ...
Fakt scheint zu sein, das es sich bei anderen um nicht initialisierte Variablen handelt.