Debuggen, error C3861: 'OutputDebugString'
-
Hallo Forum,
wie kann ich im Visual Studio 2003 in irgendeinem Fenster einen Debug String schreiben? Bei Messagebox oder OutputDebugString erhalte ich einen error C3861 (Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden) Wenn ich windows.h einbinde bekomme ich zig Fehlermeldungen.
Gibt es einen einfachen Befehl womit ich den Inhalt eines Strings anzeigen lassen kann? Die Maus drüber halten und warten bis er angezeigt wird klappt nicht es erscheinen nur ???. Genauso das Quickwatch Fenster sagt mir nur "nicht aufgelöstes Symbol". Ich befinde mich die ganze Zeit im Source meines Projektes und kann mir diese Arbeitsverweigerung des Visual Studios nicht recht erklären.
Vielen Dank
Mike
-
Wenn Du window.h nicht einbindest wirst Du nie Windows-Funktionen verwenden können....
-
Das hört sich irgentwie an, als dass du auch den String nicht direkt zugreifen kannst. Wenn selbst der Debugger (Quick watch) an der Darstellung scheitert kann dies nur 2 Dinge bedeuten.
- Entweder man benutzt eine String-Klasse welche nicht kombatibel zu einem C-String ist. Dann müsste es eine Funktion der Klasse geben, welche dir einen passenden C-String (Typ char, wchar, LPSTR, ...) zurückgibt. In der STL ist dies beispielsweise dir Funktion c_str()
- Oder der String wurde einfach nicht initialisiert.Probiere doch mal ob du den String einfach in eine Datei schreiben kannst.
-
Jochen Kalmbach schrieb:
Wenn Du window.h nicht einbindest wirst Du nie Windows-Funktionen verwenden können....
Naja, deshalb wollte ich ja in irgendein debug Fenster schreiben. Sollte OutputDebugString() nicht immer funktionieren (auch ohne windows.h). Was wäre ein ähnlicher Befehl?
@Bitte ein Bit:
Ich habe jetzt diesen Workaround:std::string sTemp; // Lokale Variable die ich nur zum Debuggen erstellt habe. m_sUnbekannt = GetString(); // m_sUnbekannt ist ein Member der aktuellen Klasse. sTemp = m_sUnbekannt; // Erst jetzt kann ich den Inhalt in sTemp sehen.
Wenn ich mit der Maus über m_sUnbekannt gehe erhalte ich ???, wenn ich über die lokale sTemp Variable gehe erhalte ich den Wert. Dieses Verhalten ist schon komisch, da ich mich immer innerhalb des Projektes befinde. Ich kann auch per Rechtsklick zur Definition von m_sUnbekannt gehen.
Innhalt des Quickwatch:
- m_sUnbekannt {???} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+ std::_String_val<char,std::allocator<char> > {_Alval={...} } std::_String_val<char,std::allocator<char> >
+ _Bx {_Buf=0x00000044 <Schlechtes Ptr> _Ptr=??? } std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
_Mysize CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden unsigned int
_Myres CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden unsigned intDer obige Workaround löst mein Problem. Ist aber schon komisch....
-
du schreibst wirres zeug.
du kannst winapi-funktionen nur aufrufen, wenn dem compiler der prototyp der jeweiligen funktion bekannt ist. das geschieht idR durch inkludieren von windows.h.
OutputDebugString nimmt auch keinen std::string oder std::wstring, sondern char* bzw. wchar_t*.dein debugging-problem(?) hat damit nix zu tun. stell zubächst sicher, das debug-informationen erzeugt werden (in den compiler-optionen). versuche auch evtl. mal einen komplett-rebuild.
-
Was ist denn unverständlich?
Man kann sich über std::string.c_str() den string als const char* holen.Ich habe alle Bin Verzeichnisse gelöscht und neu kompiliert. Die Strings werden noch immer mit ??? maskiert. Es werden dem Projekt einige Libs hinzugelinkt könnte es daran liegen? Beim Debuggen befinde ich mich natürlich in den Klassen des Projektes und nicht in der Lib.
-
OutputDebugString ist eine winapi-funktion. MessageBox auch. ohne windows.h wird das nix.
Mike unterwegs schrieb:
Wenn ich windows.h einbinde bekomme ich zig Fehlermeldungen.
wie lauten die fehlermeldungen?
Ich habe alle Bin Verzeichnisse gelöscht und neu kompiliert. Die Strings werden noch immer mit ??? maskiert.
vielleicht sind sie tatsächlich nicht gültig. die gründe kann man nur raten, z. b. weil du vielleicht irgendwo wild im speicher rumschreibst.
das ist aber auch ein typisches verhalten, wenn man versucht ein release-build zu debuggen.aus deiner beschreibung kann man keine fehlerursache schließen.
-
Ich glaube ich habe es jetzt. Nachdem ich die Libs auch im Debug Modus kompiliert habe kann ich den Inhalt der Strings sehen.
Vielen Dank