كيفية معرفة ما إذا كان عنصر تحكم صافي مرئيا باستخدام windbg
سؤال
وحصلت على crashdump أين نحن مناقشة ما إذا كان عنصر تحكم مرئية للمستخدم النهائي أم لا. أبحث مع! لم لا استطيع ان ارى اي مجال الصريح الذي يحمل قيمة صواب / خطأ مطابقة مع الخاصية مرئي، التي لا مفاجأة أن كثيرا كما نحن ربما انخفض في teritory WIN32. لا أحد يعرف كيف يمكن استنتاج ما المرئية قد عاد من ملف تفريغ؟
وذلك بفضل أوسكار
المحلول
وكان فكرتي الأولى أن هذا كان مجرد سؤال من البحث عن مجال حق، ولكن في الواقع استغرق الأمر أكثر قليلا من الحفر. إذا نظرتم تحكم في العاكس، سترى أن الخاصية مرئي تدعو 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
وسيكون لديك الدولة مرئي المثيل المحدد.
في الواقع، قد تضطر إلى الذهاب إلى أبعد من ذلك. إذا العوائد المذكورة أعلاه خاطئة، تحتاج للبحث عن الوالدين وتكرار خدعة. بالنسبة لي مثال بسيط باستخدام النموذج الذي لم يكن ضروريا.