我得到了一個crashdump,我們正在討論控件是否對最終用戶可見。看看!我看不到任何明確的字段,它保存與Visible屬性匹配的真/假值,這並不令人驚訝,因爲我們可能在win32 teritory中下降。有誰知道如何推斷Visible將從轉儲文件返回的內容?如何判斷.net控件是否使用windbg可見
感謝 奧斯卡
我得到了一個crashdump,我們正在討論控件是否對最終用戶可見。看看!我看不到任何明確的字段,它保存與Visible屬性匹配的真/假值,這並不令人驚訝,因爲我們可能在win32 teritory中下降。有誰知道如何推斷Visible將從轉儲文件返回的內容?如何判斷.net控件是否使用windbg可見
感謝 奧斯卡
我最初的想法是,這僅僅是一個仰視右外場的問題,但實際上花多一點挖。如果您查看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
注意的東西,有兩個狀態字段。我還沒有研究過爲什麼會出現這種情況,但是你想要的是System.Int32。在我的例子也有17432589.
值在GETSTATE的代碼如下
return ((this.state & flag) != 0);
因此,所有你從這裏做的是(17432589 & 2) != 0
,你就會有具體的實例可見狀態。
其實,你可能需要更進一步。如果上述返回false,則需要查找父項並重復該技巧。對於我使用不必要的Form的簡單示例。
非常好,現在我知道該控件是可見的(並且我的用戶權利...),並且在其他地方已驗證我的過程中的服務器狀態與控件所說的內容不一致,所以錯誤必須介於兩者之間的某個位置:) – Oskar 2009-10-26 15:08:23