2009-10-22 4 views
3

컨트롤이 최종 사용자에게 표시되는지 여부를 토론하는 곳인 크래시 덤프가 있습니다. Visible 속성과 일치하는 true/false 값을 포함하는 명시적인 필드를 볼 수는 없지만, win32 teritory에서는 아마 그렇게 놀랍지 않을 것입니다. 누구 Visible 덤프 파일에서 반환했을 것이라고 추론하는 방법을 알고 있습니까?.Net 컨트롤이 windbg를 사용하여 표시되는지 확인하는 방법

감사 오스카는

답변

4

내 최초의 생각이 오른쪽 필드를 찾는 단지 문제라고했지만, 실제로는 조금 더 파고했다. Reflector에서 Control을 보면 Visible 속성이 내부 상태 필드를 값 2 (STATE_VISIBLE 상수)와 비교하여 검사하는 GetVisibleCore를 호출한다는 것을 알 수 있습니다.

컨트롤이 보이는지 확인하려면 상태 필드를 찾고 비트 조작을해야합니다. 인스턴스의 주소가있는 경우

, 당신은 다음과 같은 작업을 수행 할 수

.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.

의 값이

return ((this.state & flag) != 0); 

그래서 당신이 여기에서 할 일은 (17432589 & 2) != 0입니다 다음 당신은 특정 인스턴스의 표시 상태를해야합니다으로 다시 GetState의 코드는 .

사실, 한 걸음 더 나아가 야 할 수도 있습니다. 위가 false를 반환하면 부모를 찾아서 트릭을 반복해야합니다. 필요하지 않은 Form을 사용하는 간단한 예제입니다.

+0

매우 좋았습니다. 이제 제어 도구가 보이고 (내 사용자 권한 ...) 다른 곳에서 내 프로세스의 서버 상태가 컨트롤이 말한 것과 일치하지 않는다는 것을 알았습니다. 따라서 버그가 그 중간에 있어야합니다. :) – Oskar

관련 문제