سؤال

أرغب في الوصول إلى مكدس الاستدعاءات في وقت التشغيل في تطبيق Native C++.أنا لا أستخدم IDE.كيف يمكنني عرض مكدس الاستدعاءات؟

تحديث:لدي وظيفة يتم استدعاؤها من عدة نقاط في جميع أنحاء التطبيق.ويتعطل في مناسبات نادرة.كنت أبحث عن طريقة للحصول على اسم المتصل وتسجيله.

هل كانت مفيدة؟

المحلول

أعتقد أن هذا الصفحة لديها الجواب الذي تبحث عنه.لقد قلت Visual C لذلك أفترض أنك تقصد النوافذ.

نصائح أخرى

القي نظرة على ستاك ووك64.

إذا كنت معتادًا على القيام بذلك على .NET، فستواجه مفاجأة سيئة.

يجب أن تفكر في تعيين الخاص بك عامل تصفية الاستثناءات غير المعالجة وكتابة ملف minidump من داخله.الأمر ليس بهذا التعقيد وهو كذلك وثق بشكل جيد.ما عليك سوى الالتزام بالحد الأدنى من الأشياء التي تفعلها مرة واحدة في مرشح الاستثناءات غير المعالجة (اقرأ ما يمكن كل شيء على ما يرام إذا أبدعت).

ولكن لكي تكون في الجانب الآمن (قد تتم الكتابة فوق مرشح الاستثناءات غير المعالج الخاص بك عن غير قصد)، يمكنك وضع التعليمات البرمجية الخاصة بك داخل كتلة __try/__except وكتابة التفريغ المصغر من داخل وظيفة التصفية (لاحظ أنه لا يمكن أن يكون لديك كائنات تتطلب الفك التلقائي في الدالة مع __try/__except block، إذا كانت لديك، فكر في وضعها في وظيفة منفصلة):

طويلة __stdcall myfilter(EXCEPTION_POINTERS *pexcept_info)
{
mycreateminidump(pexcept_info);
إرجاع EXCEPTION_EXECUTE_HANDLER؛
}
باطلة myfunc ()
{
__يحاول{
// المنطق الخاص بك هنا
} __except(myfilter(GetExceptionInformation())) {
// تمت معالجة الاستثناء
}
}

يمكنك بعد ذلك فحص ملف التفريغ باستخدام مصحح أخطاء من اختيارك.يمكن لكل من Visual Studio ومصححات الأخطاء من حزمة Windows Debugging Tools التعامل مع عمليات التفريغ المصغرة.

إذا كنت ترغب في الحصول على مكدس استدعاء للحادث، فإن ما تريد فعله حقًا هو تصحيح الأخطاء بعد الوفاة.إذا كنت تريد التحقق من مكدس استدعاء التطبيق أثناء تشغيله، فهذه إحدى الوظائف العديدة مستكشف العمليات SysInternals يمكن ان يعرض.

إذا لم تكن تقوم بتصحيح الأخطاء بشكل فعال، فيمكنك "تعطيل" التطبيق لإنتاج تفريغ مصغر (يمكن القيام بذلك بشكل غير جراحي ويسمح للتطبيق بمواصلة التشغيل).سيسمح لك IIRC DrWatson بالقيام بذلك، إن لم يكن userdump من دعم MS سيفعل ذلك.

يمكنك بعد ذلك تحميل التفريغ إلى Windbg ورؤية متغيرات callstack + وما إلى ذلك هناك.ستحتاج إلى رموز تطبيقك لفهم التتبع.

إذا كنت تبحث عن تتبعات نمط تعليمات برمجية أبسط في وقت التشغيل، فإنني أوصي بفئة بسيطة تقوم بإنشاء مثيل لها في كل طريقة، ويكتب المنشئ اسم الطريقة باستخدام OutputDebugString.استخدم WinDebug لعرض التتبع أثناء تشغيل البرنامج.(ضع شكلاً من أشكال التحكم في الفصل الدراسي الخاص بك، حتى لو كان مجرد متغير عام أو قيمة تسجيل، أو Atom عمومي حتى تتمكن من تشغيل التتبع أو إيقاف تشغيله حسب الرغبة).

ويتعطل في مناسبات نادرة.كنت أبحث عن طريقة للحصول على اسم المتصل وتسجيله.

ماذا تقصد بانهيارها؟انتهاك وصول؟اقسم على صفر؟ماذا بالضبط؟هل يتفاعل مع مكونات وضع kernel؟

قم بتشغيل أداة التحقق من التطبيق.يجب أن تقضي على الكثير من الأشياء.

إنشاء هذا:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\FileName.exe

تحت هذا المفتاح ، قم بإنشاء اسم سلسلة جديد:قيمة التصحيح:c:\pathtowindbg\windbg.exe -gG -xe av

إذا كنت تقوم بتشغيل تعليمات برمجية 32 بت مع WOW، فستحتاج إلى القيام بذلك ضمن wow3264node.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top