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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top