我遇到了一个故障转储,我们正在讨论控件是否对最终用户可见。看看!我看不到任何显式字段,其中包含与Visible属性匹配的true / false值,这并不会让我感到惊讶,因为我们可能在win32 teritory中失败了。有谁知道如何推断Visible从转储文件中返回的内容?
感谢 奥斯卡
答案 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,则需要查找父级并重复操作。对于我使用不必要的表单的简单示例。