So erkennen Sie, ob eine .NET -Steuerung mit Windbg sichtbar ist
Frage
Ich habe einen Crashdump bekommen, bei dem wir darüber diskutieren, ob eine Kontrolle für den Endbenutzer sichtbar war oder nicht. Schauen Sie mit! Kann ich kein explizites Feld sehen, das den wahren/falschen Wert mit der sichtbaren Eigenschaft entspricht, was nicht so sehr überrascht, wie wir wahrscheinlich im Win32 -Territorium sind. Weiß jemand, wie man abgeben kann, was sichtbar aus der Dump -Datei zurückgegeben hätte?
Danke Oskar
Lösung
Mein erster Gedanke war, dass dies nur die Frage war, die das richtige Feld nach oben nachzuschlagen, aber tatsächlich hat es ein bisschen mehr gegraben. Wenn Sie sich die Kontrolle im Reflektor ansehen, werden Sie feststellen, dass die sichtbare Eigenschaft GetVisibleCore aufruft, was ein internes Zustandsfeld gegen den Wert 2 überprüft (was zufällig der konstante Status ist).
Um herauszufinden, ob eine Kontrolle sichtbar ist, müssen wir das Zustandsfeld lokalisieren und etwas Manipulation durchführen.
Wenn Sie die Adresse der Instanz haben, können Sie Folgendes tun:
.shell -ci "!do <ADDRESS>" grep state (use findstr, if you don't have grep)
Die Ausgabe ähnelt diesem ähnlich
0:000> .shell -ci "!do 015892a4" grep state
03aeedcc 400112c 4c System.Int32 1 instance 17432589 state <=== HERE!
03aeedcc 400112d 50 System.Int32 1 instance 2060 state2
049ac32c 40011ef d0 ...lized.BitVector32 1 instance 01589374 state
03aeedcc 40011f0 ad4 System.Int32 1 static 1 stateScalingNeededOnLayout
03aeedcc 40011f1 ad8 System.Int32 1 static 2 stateValidating
03aeedcc 40011f2 adc System.Int32 1 static 4 stateProcessingMnemonic
03aeedcc 40011f3 ae0 System.Int32 1 static 8 stateScalingChild
03aeedcc 40011f4 ae4 System.Int32 1 static 16 stateParentChanged
Beachten Sie, dass es zwei staatliche Felder gibt. Ich habe nicht untersucht, warum dies der Fall ist, aber das, was Sie wollen, ist das System.Int32. In meinem Beispiel hat es einen Wert von 17432589.
Der Code in getState ist wie folgt
return ((this.state & flag) != 0);
Alles was Sie von hier aus tun müssen, ist (17432589 & 2) != 0
Und Sie haben den sichtbaren Zustand der spezifischen Instanz.
Eigentlich müssen Sie möglicherweise noch einen Schritt weiter gehen. Wenn das obige false zurückgibt, müssen Sie den Elternteil nachschlagen und den Trick wiederholen. Für mein einfaches Beispiel mit einem Formular, das nicht notwendig war.