windbgを使用して.Netコントロールが表示されるかどうかを確認する方法

StackOverflow https://stackoverflow.com/questions/1606903

  •  05-07-2019
  •  | 
  •  

質問

コントロールがエンドユーザーに表示されるかどうかを議論しているクラッシュダンプがありました。 !doを見ると、Visibleプロパティと一致するtrue / false値を保持する明示的なフィールドが表示されません。これは、おそらくwin32領域でダウンしているので、それほど驚くことではありません。誰もがVisibleがダンプファイルから返すものを推測する方法を知っていますか?

ありがとう オスカー

役に立ちましたか?

解決

最初に考えたのは、これは正しい分野を調べるだけの質問でしたが、実際にはもう少し掘り下げました。 ReflectorのControlを見ると、VisibleプロパティがGetVisibleCoreを呼び出しており、内部状態フィールドを値2(定数STATE_VISIBLEである)に対してチェックしていることがわかります。

したがって、コントロールが表示されているかどうかを確認するには、状態フィールドを見つけてビット操作を行う必要があります。

インスタンスのアドレスがわかっている場合は、次のことができます。

.shell -ci "!do <ADDRESS>" grep state   (use findstr, if you don't have grep)

出力はこれに似たものです

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

2つの状態フィールドがあることに注意してください。なぜそうなのかについては調べていませんが、必要なのはSystem.Int32です。私の例では、値は17432589です。

GetStateのコードは次のとおりです

return ((this.state & flag) != 0);

ここから行う必要があるのは(17432589&amp; 2)!= 0 であり、特定のインスタンスのVisible状態になります。

実際には、さらに一歩進む必要があります。上記がfalseを返す場合は、親を検索してトリックを繰り返す必要があります。不要なフォームを使用した簡単な例です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top