wxdebug.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:13k
源码类别:

P2P编程

开发平台:

Visual C++

  1. //------------------------------------------------------------------------------
  2. // File: WXDebug.h
  3. //
  4. // Desc: DirectShow base classes - provides debugging facilities.
  5. //
  6. // Copyright (c) Microsoft Corporation.  All rights reserved.
  7. //------------------------------------------------------------------------------
  8. #ifndef __WXDEBUG__
  9. #define __WXDEBUG__
  10. // This library provides fairly straight forward debugging functionality, this
  11. // is split into two main sections. The first is assertion handling, there are
  12. // three types of assertions provided here. The most commonly used one is the
  13. // ASSERT(condition) macro which will pop up a message box including the file
  14. // and line number if the condition evaluates to FALSE. Then there is the
  15. // EXECUTE_ASSERT macro which is the same as ASSERT except the condition will
  16. // still be executed in NON debug builds. The final type of assertion is the
  17. // KASSERT macro which is more suitable for pure (perhaps kernel) filters as
  18. // the condition is printed onto the debugger rather than in a message box.
  19. //
  20. // The other part of the debug module facilties is general purpose logging.
  21. // This is accessed by calling DbgLog(). The function takes a type and level
  22. // field which define the type of informational string you are presenting and
  23. // it's relative importance. The type field can be a combination (one or more)
  24. // of LOG_TIMING, LOG_TRACE, LOG_MEMORY, LOG_LOCKING and LOG_ERROR. The level
  25. // is a DWORD value where zero defines highest important. Use of zero as the
  26. // debug logging level is to be encouraged ONLY for major errors or events as
  27. // they will ALWAYS be displayed on the debugger. Other debug output has it's
  28. // level matched against the current debug output level stored in the registry
  29. // for this module and if less than the current setting it will be displayed.
  30. //
  31. // Each module or executable has it's own debug output level for each of the
  32. // five types. These are read in when the DbgInitialise function is called
  33. // for DLLs linking to STRMBASE.LIB this is done automatically when the DLL
  34. // is loaded, executables must call it explicitely with the module instance
  35. // handle given to them through the WINMAIN entry point. An executable must
  36. // also call DbgTerminate when they have finished to clean up the resources
  37. // the debug library uses, once again this is done automatically for DLLs
  38. // These are the five different categories of logging information
  39. enum {  LOG_TIMING = 0x01,    // Timing and performance measurements
  40.         LOG_TRACE = 0x02,     // General step point call tracing
  41.         LOG_MEMORY =  0x04,   // Memory and object allocation/destruction
  42.         LOG_LOCKING = 0x08,   // Locking/unlocking of critical sections
  43.         LOG_ERROR = 0x10,     // Debug error notification
  44.         LOG_CUSTOM1 = 0x20,
  45.         LOG_CUSTOM2 = 0x40,
  46.         LOG_CUSTOM3 = 0x80,
  47.         LOG_CUSTOM4 = 0x100,
  48.         LOG_CUSTOM5 = 0x200,
  49. };
  50. #define LOG_FORCIBLY_SET 0x80000000
  51. enum {  CDISP_HEX = 0x01,
  52.         CDISP_DEC = 0x02};
  53. // For each object created derived from CBaseObject (in debug builds) we
  54. // create a descriptor that holds it's name (statically allocated memory)
  55. // and a cookie we assign it. We keep a list of all the active objects
  56. // we have registered so that we can dump a list of remaining objects
  57. typedef struct tag_ObjectDesc {
  58.     const CHAR *m_szName;
  59.     const WCHAR *m_wszName;
  60.     DWORD m_dwCookie;
  61.     tag_ObjectDesc *m_pNext;
  62. } ObjectDesc;
  63. #define DLLIMPORT __declspec(dllimport)
  64. #define DLLEXPORT __declspec(dllexport)
  65. #ifdef DEBUG
  66.     #define NAME(x) TEXT(x)
  67.     // These are used internally by the debug library (PRIVATE)
  68.     void WINAPI DbgInitKeyLevels(HKEY hKey, bool fTakeMax);
  69.     void WINAPI DbgInitGlobalSettings(bool fTakeMax);
  70.     void WINAPI DbgInitModuleSettings(bool fTakeMax);
  71.     void WINAPI DbgInitModuleName();
  72.     DWORD WINAPI DbgRegisterObjectCreation(
  73.         const CHAR *szObjectName, const WCHAR *wszObjectName);
  74.     BOOL WINAPI DbgRegisterObjectDestruction(DWORD dwCookie);
  75.     // These are the PUBLIC entry points
  76.     BOOL WINAPI DbgCheckModuleLevel(DWORD Type,DWORD Level);
  77.     void WINAPI DbgSetModuleLevel(DWORD Type,DWORD Level);
  78.     void WINAPI DbgSetAutoRefreshLevels(bool fAuto);
  79.     // Initialise the library with the module handle
  80.     void WINAPI DbgInitialise(HINSTANCE hInst);
  81.     void WINAPI DbgTerminate();
  82.     void WINAPI DbgDumpObjectRegister();
  83.     // Display error and logging to the user
  84.     void WINAPI DbgAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
  85.     void WINAPI DbgBreakPoint(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
  86.     void WINAPI DbgBreakPoint(const TCHAR *pFileName,INT iLine,const TCHAR* szFormatString,...);
  87.     void WINAPI DbgKernelAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
  88.     void WINAPI DbgLogInfo(DWORD Type,DWORD Level,const TCHAR *pFormat,...);
  89. #ifdef UNICODE
  90.     void WINAPI DbgLogInfo(DWORD Type,DWORD Level,const CHAR *pFormat,...);
  91.     void WINAPI DbgAssert(const CHAR *pCondition,const CHAR *pFileName,INT iLine);
  92.     void WINAPI DbgBreakPoint(const CHAR *pCondition,const CHAR *pFileName,INT iLine);
  93.     void WINAPI DbgKernelAssert(const CHAR *pCondition,const CHAR *pFileName,INT iLine);
  94. #endif
  95.     void WINAPI DbgOutString(LPCTSTR psz);
  96.     //  Debug infinite wait stuff
  97.     DWORD WINAPI DbgWaitForSingleObject(HANDLE h);
  98.     DWORD WINAPI DbgWaitForMultipleObjects(DWORD nCount,
  99.                                     CONST HANDLE *lpHandles,
  100.                                     BOOL bWaitAll);
  101.     void WINAPI DbgSetWaitTimeout(DWORD dwTimeout);
  102. #ifdef __strmif_h__
  103.     // Display a media type: Terse at level 2, verbose at level 5
  104.     void WINAPI DisplayType(LPTSTR label, const AM_MEDIA_TYPE *pmtIn);
  105.     // Dump lots of information about a filter graph
  106.     void WINAPI DumpGraph(IFilterGraph *pGraph, DWORD dwLevel);
  107. #endif
  108.     #define KASSERT(_x_) if (!(_x_))         
  109.         DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__)
  110.     //  Break on the debugger without putting up a message box
  111.     //  message goes to debugger instead
  112.     #define KDbgBreak(_x_)                   
  113.         DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__)
  114.     // We chose a common name for our ASSERT macro, MFC also uses this name
  115.     // So long as the implementation evaluates the condition and handles it
  116.     // then we will be ok. Rather than override the behaviour expected we
  117.     // will leave whatever first defines ASSERT as the handler (i.e. MFC)
  118.     #ifndef ASSERT
  119.         #define ASSERT(_x_) if (!(_x_))         
  120.             DbgAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__)
  121.     #endif
  122.     #define DbgAssertAligned( _ptr_, _alignment_ ) ASSERT( ((DWORD_PTR) (_ptr_)) % (_alignment_) == 0)
  123.     //  Put up a message box informing the user of a halt
  124.     //  condition in the program
  125.     #define DbgBreak(_x_)                   
  126.         DbgBreakPoint(TEXT(#_x_),TEXT(__FILE__),__LINE__)
  127.     #define EXECUTE_ASSERT(_x_) ASSERT(_x_)
  128.     #define DbgLog(_x_) DbgLogInfo _x_
  129.     // MFC style trace macros
  130.     #define NOTE(_x_)             DbgLog((LOG_TRACE,5,TEXT(_x_)))
  131.     #define NOTE1(_x_,a)          DbgLog((LOG_TRACE,5,TEXT(_x_),a))
  132.     #define NOTE2(_x_,a,b)        DbgLog((LOG_TRACE,5,TEXT(_x_),a,b))
  133.     #define NOTE3(_x_,a,b,c)      DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c))
  134.     #define NOTE4(_x_,a,b,c,d)    DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d))
  135.     #define NOTE5(_x_,a,b,c,d,e)  DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d,e))
  136. #else
  137.     // Retail builds make public debug functions inert  - WARNING the source
  138.     // files do not define or build any of the entry points in debug builds
  139.     // (public entry points compile to nothing) so if you go trying to call
  140.     // any of the private entry points in your source they won't compile
  141.     #define NAME(_x_) ((TCHAR *) NULL)
  142.     #define DbgInitialise(hInst)
  143.     #define DbgTerminate()
  144.     #define DbgLog(_x_) 0
  145.     #define DbgOutString(psz)
  146.     #define DbgAssertAligned( _ptr_, _alignment_ ) 0
  147.     #define DbgRegisterObjectCreation(pObjectName)
  148.     #define DbgRegisterObjectDestruction(dwCookie)
  149.     #define DbgDumpObjectRegister()
  150.     #define DbgCheckModuleLevel(Type,Level)
  151.     #define DbgSetModuleLevel(Type,Level)
  152.     #define DbgSetAutoRefreshLevels(fAuto)
  153.     #define DbgWaitForSingleObject(h)  WaitForSingleObject(h, INFINITE)
  154.     #define DbgWaitForMultipleObjects(nCount, lpHandles, bWaitAll)     
  155.                WaitForMultipleObjects(nCount, lpHandles, bWaitAll, INFINITE)
  156.     #define DbgSetWaitTimeout(dwTimeout)
  157.     #define KDbgBreak(_x_)
  158.     #define DbgBreak(_x_)
  159.     #define KASSERT(_x_) ((void)0)
  160.     #ifndef ASSERT
  161. #define ASSERT(_x_) ((void)0)
  162.     #endif
  163.     #define EXECUTE_ASSERT(_x_) ((void)(_x_))
  164.     // MFC style trace macros
  165.     #define NOTE(_x_) ((void)0)
  166.     #define NOTE1(_x_,a) ((void)0)
  167.     #define NOTE2(_x_,a,b) ((void)0)
  168.     #define NOTE3(_x_,a,b,c) ((void)0)
  169.     #define NOTE4(_x_,a,b,c,d) ((void)0)
  170.     #define NOTE5(_x_,a,b,c,d,e) ((void)0)
  171.     #define DisplayType(label, pmtIn) ((void)0)
  172.     #define DumpGraph(pGraph, label) ((void)0)
  173. #endif
  174. // Checks a pointer which should be non NULL - can be used as follows.
  175. #define CheckPointer(p,ret) {if((p)==NULL) return (ret);}
  176. //   HRESULT Foo(VOID *pBar)
  177. //   {
  178. //       CheckPointer(pBar,E_INVALIDARG)
  179. //   }
  180. //
  181. //   Or if the function returns a boolean
  182. //
  183. //   BOOL Foo(VOID *pBar)
  184. //   {
  185. //       CheckPointer(pBar,FALSE)
  186. //   }
  187. // These validate pointers when symbol VFWROBUST is defined
  188. // This will normally be defined in debug not retail builds
  189. #ifdef DEBUG
  190.     #define VFWROBUST
  191. #endif
  192. #ifdef VFWROBUST
  193.     #define ValidateReadPtr(p,cb) 
  194.         {if(IsBadReadPtr((PVOID)p,cb) == TRUE) 
  195.             DbgBreak("Invalid read pointer");}
  196.     #define ValidateWritePtr(p,cb) 
  197.         {if(IsBadWritePtr((PVOID)p,cb) == TRUE) 
  198.             DbgBreak("Invalid write pointer");}
  199.     #define ValidateReadWritePtr(p,cb) 
  200.         {ValidateReadPtr(p,cb) ValidateWritePtr(p,cb)}
  201.     #define ValidateStringPtr(p) 
  202.         {if(IsBadStringPtr((LPCTSTR)p,INFINITE) == TRUE) 
  203.             DbgBreak("Invalid string pointer");}
  204.     #define ValidateStringPtrA(p) 
  205.         {if(IsBadStringPtrA((LPCSTR)p,INFINITE) == TRUE) 
  206.             DbgBreak("Invalid ANSI string pointer");}
  207.     #define ValidateStringPtrW(p) 
  208.         {if(IsBadStringPtrW((LPCWSTR)p,INFINITE) == TRUE) 
  209.             DbgBreak("Invalid UNICODE string pointer");}
  210. #else
  211.     #define ValidateReadPtr(p,cb) 0
  212.     #define ValidateWritePtr(p,cb) 0
  213.     #define ValidateReadWritePtr(p,cb) 0
  214.     #define ValidateStringPtr(p) 0
  215.     #define ValidateStringPtrA(p) 0
  216.     #define ValidateStringPtrW(p) 0
  217. #endif
  218. #ifdef _OBJBASE_H_
  219.     //  Outputting GUID names.  If you want to include the name
  220.     //  associated with a GUID (eg CLSID_...) then
  221.     //
  222.     //      GuidNames[yourGUID]
  223.     //
  224.     //  Returns the name defined in uuids.h as a string
  225.     typedef struct {
  226.         CHAR   *szName;
  227.         GUID    guid;
  228.     } GUID_STRING_ENTRY;
  229.     class CGuidNameList {
  230.     public:
  231.         CHAR *operator [] (const GUID& guid);
  232.     };
  233.     extern CGuidNameList GuidNames;
  234. #endif
  235. #ifndef REMIND
  236.     //  REMIND macro - generates warning as reminder to complete coding
  237.     //  (eg) usage:
  238.     //
  239.     //  #pragma message (REMIND("Add automation support"))
  240.     #define QUOTE(x) #x
  241.     #define QQUOTE(y) QUOTE(y)
  242.     #define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) ") :  " str
  243. #endif
  244. //  Method to display objects in a useful format
  245. //
  246. //  eg If you want to display a LONGLONG ll in a debug string do (eg)
  247. //
  248. //  DbgLog((LOG_TRACE, n, TEXT("Value is %s"), (LPCTSTR)CDisp(ll, CDISP_HEX)));
  249. class CDispBasic
  250. {
  251. public:
  252.     CDispBasic() { m_pString = m_String; };
  253.     ~CDispBasic();
  254. protected:
  255.     PTCHAR m_pString;  // normally points to m_String... unless too much data
  256.     TCHAR m_String[50];
  257. };
  258. class CDisp : public CDispBasic
  259. {
  260. public:
  261.     CDisp(LONGLONG ll, int Format = CDISP_HEX); // Display a LONGLONG in CDISP_HEX or CDISP_DEC form
  262.     CDisp(REFCLSID clsid);      // Display a GUID
  263.     CDisp(double d);            // Display a floating point number
  264. #ifdef __strmif_h__
  265. #ifdef __STREAMS__
  266.     CDisp(CRefTime t);          // Display a Reference Time
  267. #endif
  268.     CDisp(IPin *pPin);          // Display a pin as {filter clsid}(pin name)
  269.     CDisp(IUnknown *pUnk);      // Display a filter or pin
  270. #endif // __strmif_h__
  271.     ~CDisp();
  272.     //  Implement cast to (LPCTSTR) as parameter to logger
  273.     operator LPCTSTR()
  274.     {
  275.         return (LPCTSTR)m_pString;
  276.     };
  277. };
  278.  
  279. #if defined(DEBUG)
  280. class CAutoTrace
  281. {
  282. private:
  283.     const TCHAR* _szBlkName;
  284.     const int _level;
  285.     static const TCHAR _szEntering[];
  286.     static const TCHAR _szLeaving[];
  287. public:
  288.     CAutoTrace(const TCHAR* szBlkName, const int level = 15)
  289.         : _szBlkName(szBlkName), _level(level)
  290.     {DbgLog((LOG_TRACE, _level, _szEntering, _szBlkName));}
  291.  
  292.     ~CAutoTrace()
  293.     {DbgLog((LOG_TRACE, _level, _szLeaving, _szBlkName));}
  294. };
  295.  
  296. #if defined (__FUNCTION__)
  297. #define AMTRACEFN()  CAutoTrace __trace(TEXT(__FUNCTION__))
  298. #define AMTRACE(_x_) CAutoTrace __trace(TEXT(__FUNCTION__))
  299. #else
  300. #define AMTRACE(_x_) CAutoTrace __trace _x_
  301. #define AMTRACEFN()
  302. #endif
  303. #else
  304. #define AMTRACE(_x_)
  305. #define AMTRACEFN()
  306. #endif
  307. #endif // __WXDEBUG__