2009-10-22 39 views
3

我得到了一個crashdump,我們正在討論控件是否對最終用戶可見。看看!我看不到任何明確的字段,它保存與Visible屬性匹配的真/假值,這並不令人驚訝,因爲我們可能在win32 teritory中下降。有誰知道如何推斷Visible將從轉儲文件返回的內容?如何判斷.net控件是否使用windbg可見

感謝 奧斯卡

回答

4

我最初的想法是,這僅僅是一個仰視右外場的問題,但實際上花多一點挖。如果您查看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的簡單示例。

+0

非常好,現在我知道該控件是可見的(並且我的用戶權利...),並且在其他地方已驗證我的過程中的服務器狀態與控件所說的內容不一致,所以錯誤必須介於兩者之間的某個位置:) – Oskar 2009-10-26 15:08:23

相關問題