如何使用windbg判断.Net控件是否可见

时间:2009-10-22 12:34:23

标签: .net controls windbg visible

我遇到了一个故障转储,我们正在讨论控件是否对最终用户可见。看看!我看不到任何显式字段,其中包含与Visible属性匹配的true / false值,这并不会让我感到惊讶,因为我们可能在win32 teritory中失败了。有谁知道如何推断Visible从转储文件中返回的内容?

感谢 奥斯卡

1 个答案:

答案 0 :(得分:4)

我最初的想法是,这只是一个查找正确领域的问题,但实际上需要更多的挖掘。如果你看一下Control in Reflector,你会看到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,你将拥有特定实例的Visible状态。

实际上,您可能需要更进一步。如果上面的内容返回false,则需要查找父级并重复操作。对于我使用不必要的表单的简单示例。