.net - 如何使用 Windbg 判断 .Net 控件是否可见

标签 .net controls windbg visible

我得到了一个故障转储,其中我们正在讨论控件是否对最终用户可见。使用 !do 进行查看时,我看不到任何包含与 Visible 属性匹配的 true/false 值的显式字段,这并不奇怪,因为我们可能处于 win32 领域。有谁知道如何推断从转储文件中返回的 Visible 内容?

谢谢 奥斯卡

最佳答案

我最初的想法是这只是一个查找正确领域的问题,但实际上需要更多的挖掘。如果您查看 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,则需要查找父级并重复该技巧。对于我使用不必要的表单的简单示例。

关于.net - 如何使用 Windbg 判断 .Net 控件是否可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606903/

相关文章:

c# - 如何组合多个 Func<> 委托(delegate)

c# - 无法将数据列从一个数据表复制到另一个数据表

为移动电话开发时应避免的 Asp.net 控件

ios - MPVolumeView Airplay 仅在镜像时触摸

c++ - Windbg "!locks"命令不起作用,我还能获取信息吗?

debugging - 如何闯入KD(Windbg)导致Explorer崩溃

c# - 在自定义 datagridviewCell 上验证单元格的值

c# - mscorlib 4.x 和 mscorlib 2.x 之间的 MSBuild 冲突

wpf - 如何将WPF选项卡项标题扩展到父控件宽度

Windbg - 如何避免 "Press Enter to continue"?执行.shell时