سؤال

في MFC C++ (Visual Studio 6) اعتدت على استخدام تتبع الكلية من أجل التصحيح.هل هناك ما يعادل بيان عادي win32 ؟

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

المحلول

و_RPTn يعمل كبيرة، ولكن ليس تماما كما مريحة. هنا هو بعض التعليمات البرمجية الذي يجسد البيان TRACE MFC بوصفها وظيفة السماح عدد متغير من الوسائط. ويضيف أيضا TraceEx ماكرو التي بإلحاق ملف المصدر ورقم الخط بحيث يمكنك النقر مرة أخرى إلى الموقع للبيان.

تحديث: إن التعليمات البرمجية الأصلية على CodeGuru لا ترجمة بالنسبة لي في وضع الإصدار حتى لقد غيرت الطريقة التي تتم إزالة البيانات TRACE لوضع الإصدار. هنا هي لغتي المصدر الكامل أن أضع في Trace.h. بفضل توماس Rizos لالأصلي :

// TRACE macro for win32
#ifndef __TRACE_H__850CE873
#define __TRACE_H__850CE873

#include <crtdbg.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#ifdef _DEBUG
#define TRACEMAXSTRING  1024

char szBuffer[TRACEMAXSTRING];
inline void TRACE(const char* format,...)
{
    va_list args;
    va_start(args,format);
    int nBuf;
    nBuf = _vsnprintf(szBuffer,
                   TRACEMAXSTRING,
                   format,
                   args);
    va_end(args);

    _RPT0(_CRT_WARN,szBuffer);
}
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
                &strrchr(__FILE__,'\\')[1],__LINE__); \
                _RPT0(_CRT_WARN,szBuffer); \
                TRACE
#else
// Remove for release mode
#define TRACE  ((void)0)
#define TRACEF ((void)0)
#endif

#endif // __TRACE_H__850CE873

نصائح أخرى

وهناك OutputDebugString أيضا. لكن هذا لن يتم إزالتها عند تجميع الافراج عنهم.

وأنا مجرد استخدام شيء من هذا القبيل (من الذاكرة، لم تختبر على الإطلاق ...)

#define TRACE(msg) {\
    std::ostringstream ss; \
    ss << msg << "\n"; \
    OutputDebugString(msg.str()); \
}

وبعد ذلك أستطيع أن أكتب أشياء مثل: -

TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);

ويمكنك لف أنه في بعض #ifdefs إلى إزالته في الإفراج يبني بسهولة بما فيه الكفاية.

ولقد وجدت أن استخدام الماكرو _RPT() ستعمل أيضا مع ملف مصدر C في Visual Studio 2005. هذه المقالة <لأ href = "http://www.cprogramming.com/tutorial/visual_studio_trace_log_messages.html" يختلط = "نوفولو "> التصحيح مع Visual Studio 2005/2008: تسجيل وتتبع يوفر لمحة عامة عن TRACE، _RPT، وغيرها من وحدات الماكرو نوع تسجيل

وأنا توليد خط لملف سجل يسمى ASSRTLOG الذي يحتوي على السجلات وعند كتابة السجل إلى ملف، أود أيضا أن تفعل سطر التعليمات البرمجية المصدر التالية:

_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);

وهذا الخط يضع نفسه السجل الذي يتم الخوض في ملف السجل في إطار إخراج البصرية ستوديو 2005 IDE.

وكنت قد تكون مهتمة في الميكانيكا وراء النهج الذي تستخدمه لتسجيل. لدينا PifLogAbort() وظيفة التي تقبل سلسلة من الحجج التي تستخدم بعد ذلك لإنشاء سجل. وتشمل هذه الحجج اسم الملف حيث يتم إنشاء سجل مع رقم السطر. الماكرو يبدو مثل هذا:

#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort( (UCHAR *)  #x , (UCHAR *)  __FILE__ , (UCHAR *) txt , __LINE__ );}

ووتعريف الدالة لPifLogAbort() تبدو هذه:

PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)

وواستخدام الماكرو سنقوم إدراج سطر مثل هذا:

NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn():  EtkTimeIn() returned error");

ما هذا الماكرو سوف نفعله هو أنه إذا كان رمز الإرجاع هو أقل من 0 (فشل تأكيد)، سيتم إنشاء سجل مع نص المقدمة. يتضمن سجل الحالة التي ولدت سجل جنبا إلى جنب مع اسم الملف ورقم السطر.

ووPifLogAbort() وظيفة يولد السجلات بطول محدد ويعامل ملف الإخراج كمنطقة عازلة دائري. سجلات وقتا وتاريخ الطوابع أيضا.

في تلك الحالات حيث نريد لتوليد نص وصفي بشكل حيوي في وقت التشغيل، ربما لتوفير قيمة رمز الخطأ الفعلية، ونحن نستخدم وظيفة sprintf () مع منطقة عازلة كما في تسلسل التعليمات البرمجية التالية:

if (sErrorSave != STUB_BM_DOWN) {
    char xBuff[128];
    sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError);
    NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff);
}

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

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

إذا كنت مجرد تحتاج إلى تفريغ المعلومات عند وصول كود بعض نقاط التفتيش، جنبا إلى جنب مع محتوى متغير، كومة آثار، أو أسماء المتصل، فيجوال استوديو <لأ href = "http://blogs.msdn.com/b/visualstudioalm/archive /2013/10/10/tracepoints.aspx "يختلط =" نوفولو "> Tracepoints غير خيار غير تدخلية للقيام بذلك.

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