Fehler in iosfwd: nicht lokalisierbar...



  • Hallo ich schon wieder.

    Ich habe seit ein paar Tagen ganz sporadisch einen Fehler wenn ich debugge.
    Ich weiß nicht wodurch der ausgelöst wird da er nur auftritt wenn ich mehrere Clients gleichzeitig laufen lasse und somit debuggen schwierig ist.
    (Naja ne Vermutung habe ich natürlich)

    Das was immer gleich ist, ist die Fehlermeldung.

    Diese tritt in der Datei iosfwd auf und zwar hier:

    462: static const _Elem *__CLRCALL_OR_CDECL find(const _Elem *_First, size_t         _Count,
    463:		const _Elem& _Ch)
    464:		{	// look for _Ch in [_First, _First + _Count)
    465://		_DEBUG_POINTER(_First);
    466:		return ((const _Elem *)::memchr(_First, _Ch, _Count));
    467:		}
    

    Der Cursor ist dann bei Zeile 466.

    Man kann ja herauslesen, daß dieser Fehler in der Funktion find auftritt.
    Nur wodurch?

    Meine Vermutung ist, daß ich find in einem nicht vorhandenen string was suchen lassen. Kann das sein?
    Was für eine Möglichkeit gäbe es noch.

    Ich weiß absolut nicht an welcher Stelle das vorkommt..

    Danke Mondmann



  • Erstens: Wessen find()-Methode ist denn das überhaupt? Und von wo aus wurde die aufgerufen?

    Zweitens: Kannst du mal nachsehen, was sich hinter dem Makro "_DEBUG_POINTER" verbirgt?

    (und drittens: Welcher Compiler?)



  • Hallo Mondmann,

    es handelt sich um die statische Funktion std::char_traits<>::find. Diese wird aufgerufen, wenn festgestellt werden soll, ob ein bestimmtes Zeichen sich innerhalb einer angegebenen Menge von zeichen befindet oder nicht. Alle find-Methoden der std::string-Klasse benutzen dies (find, find_first_of, usw.).

    Wahrscheinlich übergibst Du an so eine Methode einen Nullpointer oder einen ungültigen Pointer. Wenn Du im Debugger bist, so gehe im Stack nach oben bis Du in Deiner Applikation landest und schaue Dir dort die Werte der übergebenen Parameter an.

    Gruß
    Werner



  • Hallo Salomon vielen Dank für die Erläuterung.

    Nur noch ne frage:

    Wie mache ich das "Im Stack nach oben gehen".
    Also der Fehler tritt auf und der Debugger fragt mich ob ich weiter ausführen oder unterbrechen will. Ich wähle dann unterbrechen weils eh nicht weitergeht.

    Wie komme ich dann "zurück" bis ich an meiner Funktion bin?

    CStoll::Salomon:

    Ich benutze VC++ 2005 Express.
    Ist bis auf den fehlenden Ressource Editor identisch mit dem "normalen" VC++

    DEBUG_POINTER

    #define _DEBUG_POINTER(first)	\
    	_Debug_pointer(first, __FILEW__,__LINE__)
    

    Das ist eben die Frage von wo aus die find() Funktion aufgerufen wird...



  • Ich denke ich habs.
    Ich kann mit Strg+- zurück.
    Ist es das was du gemeint hast mit "Im Stack zurück"?



  • estartu hat vor einiger Zeit mal einen Magazinartikel zum Thema "Debugging mit VC++6" geschrieben - der ist sicher hilfreich. ("im Stack zurück" bzw. "im Stack nach oben" bedeutet, daß du im Call-Stack die Funktion raussuchen solltest, von der aus find() aufgerufen wurde - ein paar Ebenen weiter oben kommt dann auch dein eigener Code, der vermutlich den Fehler verursacht hat)

    (btw, mein VC kennt kein DEBUG_POINTER, scheint also eine etwas neuere Erfindung zu sein)



  • Und wo find ich den Call Stack?

    Danke, den Artikel werde ich mir mal aufmerksam durchlesen.
    Super Forum hier!

    Mondmann



  • Im Debugger hast du die Liste der lokalen Variablen - und darüber eine mit "Kontext:" beschriftete Combo-Box:

    (In der Combobox kannst du alle Funktionen des Callstacks ansehen und auswählen)

    PS: Das Bild dort stammt aus estartu's Artikel



  • Danke 👍



  • Falls es jemand interessiert:
    Ich hatte einen Fehler nicht abgefangen (natürlich) und somit übergab ich dem armen find() einen NULL-Pointer...


Anmelden zum Antworten