Debugger kaputt?
-
anmerker schrieb:
Es heißt "einen" und "keinen".

Wenn du nun noch den rolleyes Smilie wegnimmst und korrekt argumentierst, wieso es so sein soll, dann will ich sogar gerne auf dich hören :p
Und nur so am Rande: Aus irgendeinem Grund war ich ungenügend im Deutschaufsatz an der Matura und gesamthaft war ich nur knapp genügend. Wenn es anders gewesen wäre, hätte ich auch Deutsch studiert

Grüssli
-
Ähm, ich benutzt einen Debug Build.
Ich habe gerade mal die Variable umbenannt in foo2 und dann zeigt der Debugger die richtigen Werte an. Was zur Hölle ist das?
-
Zur Not versuch mal, das Projekt zu bereinigen und neu zu erstellen. Vielleicht hilft's auch, die Debug-Datenbank zu löschen.
Eine wirklich verlässliche Aussage bekommst du, indem du dir eigene Debug-Ausgabe machst (OutputDebugString/printf/cout...).
-
wtfer schrieb:
Kennt wer diese Anomalie? Was kann ich dagegen tun?

Versuch mal die Schleife mit einer simplen Bedingung anzugehen. Z.B. i < 10
Denn das hier
for(uint i=0; factory->EnumAdapters(i, &dxAdapter) != DXGI_ERROR_NOT_FOUND; i++)und besonders
factory->EnumAdapters(i, &dxAdapter)sieht schon verdächtig aus. Ist es möglich, dass EnumAdapters() in der Nähe der Adresse von dxAdapter im Speicher rumfummelt?
-
Ich hab so ziemlich alles probiert. Hab die ndb Datei gelöscht, den gesamten Debug Ordner (mit den ganzen Binaries) gelöscht und ich benutze definitiv einen Debug Build.
Blindfisch schrieb:
sieht schon verdächtig aus. Ist es möglich, dass EnumAdapters() in der Nähe der Adresse von dxAdapter im Speicher rumfummelt?
Wieso sieht das verdächtig ist? Das ist eine ganz normale Funktion. Selbst WENN die im Speicher von foo rumpfuschen würde (was nahezu unmöglich ist), müssten die Zuweisungen im Schleifenrumpf ja funktionieren. Tun sie aber nicht - sie werden ignoriert.
Ich habe gerade noch was entdeckt, was ich absolut nicht verstehe. Die Methode hat folgende "Signatur":
bool DDManager::enumAdapters(std::vector<Adapter>& adapters);und aufrufen tu ich sie so:
std::vector<Adapter> ad; DDManager::enumAdapters(ad);Ich setze eine Breakpoint in die letzte Zeile der Funktion enumAdapters und da ist der vector korrekt gefüllt mit einer Adapter Struktur. Wenn ich mit F10 weiter gehe (sprich: aus der Funktion raus) und mir dann vector ad anschaue, dann steht da überall:
format error: cannot obtain value
Was ist denn das nun wieder? Das ist doch technisch absolut unmöglich! Der vector wird ja nicht als Kopie übergeben sondern by-reference und der übergebene Vektor ad und der Vektor in der Funktion müssen doch IDENTISCH sein.

-
wtfer schrieb:
Tun sie aber nicht - sie werden ignoriert.
Wie gesagt, bastel dir eine verlässliche Ausgabe...
-
wtfer schrieb:
...müssten die Zuweisungen im Schleifenrumpf ja funktionieren. Tun sie aber nicht - sie werden ignoriert.
Hast Recht.
Wie sieht es mit einer simplen Ausgabe von foo nach der Zuweisung aus?
-
Hm, ich habe gerade eine interessante Sache herausgefunden.
Die Methodestatic bool DDManager::enumAdapters(std::vector<Adapter>& adapters);steht in einer statischen C++ Lib.
Der Aufruf der Methode:std::vector<Adapter> v; DDManager::enumAdapters(v);findet in einer C++/CLI managed exe statt.
Ich habe mal (aus Verzweiflung) ein reines natives C++ Projekt angelegt und da die Methode aufgerufen. Und siehe da: Der Vektor war am Ende der Methode und auch nach Verlassen der Methode korrekt gefüllt.
Nur wenn ich sie aus meinem C++/CLI Projekt aus aufrufe, dann steht nach Verlassen der Methode in den Variablen von Adapter an vielen Stellen
format error: cannot obtain value
(aber nicht überall. Viele Variablen sind richtig gefüllt).
Hat irgendwie wer eine Idee woran das liegt?
-
Gut, dass mit "meinem C++/CLI Projekt" nun der entscheidende Hinweis gefallen ist. Erleichtert über die Tatsache, dass dieses seltsame Verhalten mit der wunderbaren alten Welt, meiner Welt, nichts zu tun hat verlasse ich dieses Thema ...
-
Hier gibts auch ein eigenes Board für deinen managed Kram.
-
Kann mich bitte jemand verschieben in das Forum für "managed kram"
?
-
Kommando zurück. Verschiebt mich bitte doch nicht. Ich erstell einen neuen Thread (mit besserer Beschreibung).