2009-10-22 40 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

相关问题