
واجهة أمامية لـ PowerShell لمحرك تصحيح أخطاء Windows.
واجهة أمامية لـ PowerShell لمحرك مصحح أخطاء Windows.
هل أنت مستعد للتنقل باستخدام مفتاح التبويب لتحقيق الإنجاز؟ للحصول على مقدمة أسرع، ألق نظرة على البدء.
هذا المشروع ليس من إنتاج أو اعتماد أو مراقبة فريق مصحح أخطاء Windows. يرحب فريق المصحح بالملاحظات حول واجهة برمجة التطبيقات (API) والواجهات الأمامية الخاصة بهم (windbg، kd، وغيرها)، لكن لا توجد لهم أي صلة بهذا المشروع. لا تقم بتقديم تقارير الأخطاء أو الملاحظات إلى فريق المصحح بخصوص هذا المشروع.
هذا ليس مشروعًا ممولًا: لا توجد له موارد رسمية مخصصة، ولا يعمل عليه سوى المتطوعين. لا تعتمد على هذا المشروع في أي تبعيات إنتاجية إلا إذا كنت على استعداد لدعمه بالكامل بنفسك. لا تتردد في تقديم المشكلات (Issues) وإرسال طلبات السحب (Pull Requests)، لكن ضع في اعتبارك أنه مع الموارد التطوعية المحدودة، قد يستغرق الأمر بعض الوقت قبل معالجة مساهماتك.
هذا مشروع تجريبي: لم يكتمل بعد، ويجب أن تتوقع حدوث تغييرات جذرية غالبًا.
نتيجة لإخلاء المسؤولية أعلاه: سأتجنب ربط DbgShell بأهداف حية عالية القيمة.
https://aka.ms/dbgshell-latest
هل سبق لك أن حاولت أتمتة أي شيء في المصحح؟ (cdb/ntsd/kd/windbg) كيف كانت النتيجة؟
الدافع الرئيسي لـ DbgShell هو أنه من الصعب جدًا أتمتة أي شيء في المصحح. هناك إمكانيات اليوم للمساعدة في أتمتة المصحح بالطبع. لكن في رأيي، لا تلبي احتياجات الناس.
الهدف من مشروع DbgShell هو جلب فوائد عالم PowerShell القائم على الكائنات إلى عالم تصحيح الأخطاء. عندما تقوم بـ 'dt' لتفريغ 'كائن'، يجب أن تحصل على كائن فعلي. يجب أن تكون البرمجة النصية سهلة مثل كتابة سكربت PowerShell.
يوفر مشروع DbgShell واجهة أمامية لـ PowerShell لـ dbgeng.dll، بما في ذلك:
المضيف المخصص لا يزال برنامجًا قائمًا على سطر الأوامر (conhost.exe) (مماثل لـ ntsd/cdb/kd)، ولكن يمكن استدعاؤه من windbg (!DbgShell).
بالإضافة إلى جعل الأتمتة أسهل وأكثر قوة، سيعالج أيضًا مخاوف أخرى، مثل سهولة الاستخدام للأشخاص الذين لا يضطرون إلى استخدام المصححات كثيرًا. (شكوى سمعتها هي أنه "عندما ينتهي بي الأمر بحاجة لاستخدام windbg، أقضي كل وقتي في .CHM")
بالنسبة لمستخدمي windbg المتمرسين، من ناحية أخرى، هدف آخر هو جعل الانتقال سلسًا قدر الإمكان. لذلك، على سبيل المثال، موفر مساحة الاسم ليس الطريقة الوحيدة للوصول إلى البيانات؛ لا يزال بإمكانك استخدام الأوامر التقليدية مثل "~3 s"، "k"، إلخ.
أنا لا أتحدث فقط عن النوع الذي تفتح فيه محرر نصوص وتكتب سكربت كبير لفعل شيء معقد—أنا أتحدث أيضًا عن القدرة على كتابة أشياء بسيطة نسبيًا مباشرة على سطر الأوامر. هناك العديد من المواقف التي قد ترغب فيها في استخدام القليل من المنطق، ولكن ليس شيئًا كبيرًا أو قابلاً لإعادة الاستخدام لدرجة أنك قد ترغب في حفظه. يجب أن يكون من السهل كتابة "أوامر سطر واحد" مثل "توقف عند CreateFile إذا كان الملف الذي يتم فتحه على سطح المكتب وكانت الدالة Blah موجودة على المكدس."
دعني أوضح: استغرق مني حوالي 4 سنوات حتى "أعتاد" على PowerShell. أشعر أن له حوافًا حادة، وجوانب صعبة بكل بساطة، والكثير من الأخطاء، سواء في التصميم أو التنفيذ. أحيانًا يزعجني حقًا. ومع ذلك، فوائد PowerShell مقنعة، وأقنعتني أنه أفضل شيء لاستخدامه لهذا المشروع:
Get-Command، وإكمال علامة التبويب، والقدرة على عرض البيانات الهرمية مثل نظام الملفات، والمرافق لتوفير وتجميع المساعدة، جيدة جدًا.dt" "لتفريغ" "كائن"، والحصول فعليًا على كائن. DbgShell يفعل ذلك.cd" إلى نظام الملفات، السجل، Active Directory، إلخ؛ يمكنك تنفيذ Send-MailMessage، Get-WmiObject، Invoke-WebRequest، Invoke-RestMethod، تشغيل البرامج التعسفية، إلخ.DbgShell كان في "وضع النمذجة الأولية" لفترة طويلة. لقد أمضيت الكثير من الوقت في معرفة كيف يمكن أو ينبغي فعل شيء ما، ولكن ليس بالضرورة "إنهاء" كل شيء. هناك عدد كبير من المهام المعلقة (TODOs) في الكود الحالي. لذا، على الرغم من أنه بدأ يصبح مفيدًا فعليًا، إلا أن المشروع لا يزال أخضرًا جدًا. ومع ذلك، يمكنه بالتأكيد إظهار ما يكفي ليعطيك فكرة جيدة عما ينبغي أن يكون عليه.
فيما يلي بعض لقطات الشاشة. من المهم ملاحظة أن لا شيء تراه هو إخراج نص من dbgeng. على الرغم من أن بعض الأشياء في المخرجات ستبدو مألوفة، فإن ذلك فقط لأنني استخدمت ميزات تنسيق وإخراج PowerShell لتخصيص كيفية عرض كائنات معينة—جميع المخرجات التي تراها تتوافق فعليًا مع كائنات .NET حقيقية وكاملة. على سبيل المثال، رسائل ModLoad تلك تتوافق كل منها مع كائن MS.Dbg.ModuleLoadedEventArgs، الذي يحتوي على خصائص أكثر مما يتم عرضه عند إرساله إلى Out-Default. لا يوجد تحليل سلاسل نصية لأي شيء من dbgeng على الإطلاق. (حسنًا... تقريبًا. لقد قمت ببعض التنازلات حيث لا توجد طريقة أخرى للحصول على المعلومات. على سبيل المثال، تفكيك الأشياء، أو تحليل الاسم الرمزي لدالة معدلة (adjustor thunk) للعثور على الإزاحة).
هذا نوع من سيناريو "hello world": الاتصال بمثيل من cmd.exe. أستخدم أولاً الأمر المدمج في PowerShell Start-Process، ثم أوجه الإخراج إلى أمر DbgShell Connect-Process، ثم أتجول في مساحة الاسم:

هنا قمت بالاتصال ببرنامج اختبار، ونظرت إلى المكدس، وانتقلت إلى إطار مكدس معين، وأفرغت المتغيرات المحلية، وفحصت قيمة std::map محلية، وفحصت بعض معلومات النوع لقيمة تعداد محلية. لاحظ عرض قيمة التعداد: لا يتعامل DbgShell فقط مع البحث عن الاسم الرمزي للمفردات المفردة، ولكن أيضًا عندما يتم دمج عدة مفردات معًا بواسطة OR. لا يمكنك معرفة ذلك من لقطة الشاشة، ولكن هناك إكمال بعلامة التبويب لكل هذه الأشياء.

!dbgshell" لفتح وحدة تحكم DbgShell.مرخص بموجب رخصة MIT.
يرحب هذا المشروع بالمساهمات والاقتراحات. تتطلب معظم المساهمات منك الموافقة على اتفاقية ترخيص المساهم (CLA) التي تعلن أن لديك الحق في، وأنك تمنحنا بالفعل، الحقوق لاستخدام مساهمتك. للحصول على التفاصيل، قم بزيارة https://cla.microsoft.com.
عند تقديم طلب سحب، سيقوم روبوت CLA تلقائيًا بتحديد ما إذا كنت بحاجة إلى تقديم CLA وتزيين طلب السحب بشكل مناسب (على سبيل المثال، تسمية، تعليق). ما عليك سوى اتباع التعليمات المقدمة من الروبوت. ستحتاج فقط إلى القيام بذلك مرة واحدة عبر جميع المستودعات التي تستخدم CLA الخاص بنا.
انظر المساهمة لمزيد من المعلومات حول المساهمة في المشروع.
اعتمد هذا المشروع مدونة قواعد السلوك مفتوحة المصدر من Microsoft.
لمزيد من المعلومات، راجع الأسئلة الشائعة حول مدونة قواعد السلوك أو اتصل بـ [email protected] مع أي أسئلة أو تعليقات إضافية.
يمكنك العثور على مقدمة فيديو قصيرة (3 دقائق) هنا: https://youtu.be/ynbg2zZ1Igc