DEBUG.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //+---------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright 1992 - 1997 Microsoft Corporation.
  5. //
  6. //  File:       debug.c
  7. //
  8. //  Contents:   Debugging support functions
  9. //
  10. //  Classes:
  11. //
  12. //  Functions:
  13. //
  14. //  Note:       This file is not compiled for retail builds
  15. //
  16. //  History:    4-29-93   RichardW   Created
  17. //
  18. //----------------------------------------------------------------------------
  19. //
  20. //  For ease of debugging the SPMgr, all the debug support functions have
  21. //  been stuck here.  Basically, we read info from win.ini, since that allows
  22. //  us to configure the debug level via a text file (and DOS, for example).
  23. //
  24. //  Format is:
  25. //
  26. //  win.ini
  27. //
  28. //  [Gina]
  29. //      DebugFlags=<Flag>[<,Flag>]*
  30. //
  31. //  WHERE:
  32. //      Flag is one of the following:
  33. //          Error, Warning, Trace
  34. //
  35. #if DBG         // NOTE:  This file not compiled for retail builds
  36. #include "gina.h"
  37. #include <stdio.h>
  38. #include <wchar.h>
  39. FILE *  LogFile;
  40. DWORD   GINAInfoLevel = 3;
  41. // Debugging support functions.
  42. // These two functions do not exist in Non-Debug builds.  They are wrappers
  43. // to the commnot functions (maybe I should get rid of that as well...)
  44. // that echo the message to a log file.
  45. char   szSection[] = "Gina";
  46. char * DebLevel[] = {"GINA-Error", "GINA-Warn", "GINA-Trace"
  47.                     };
  48. typedef struct _DebugKeys {
  49.     char *  Name;
  50.     DWORD   Value;
  51. } DebugKeys, *PDebugKeys;
  52. DebugKeys   DebugKeyNames[] = {
  53.                 {"Error",       DEB_ERROR},
  54.                 {"Warning",     DEB_WARN},
  55.                 {"Trace",       DEB_TRACE},
  56.                 };
  57. #define NUM_DEBUG_KEYS  sizeof(DebugKeyNames) / sizeof(DebugKeys)
  58. #define NUM_BREAK_KEYS  sizeof(BreakKeyNames) / sizeof(DebugKeys)
  59. //+---------------------------------------------------------------------------
  60. //
  61. //  Function:   LogEvent
  62. //
  63. //  Synopsis:   Logs an event to the console and, optionally, a file.
  64. //
  65. //  Effects:
  66. //
  67. //  Arguments:  [Mask]   --
  68. //              [Format] --
  69. //              [Format] --
  70. //
  71. //  Requires:
  72. //
  73. //  Returns:
  74. //
  75. //  Signals:
  76. //
  77. //  Modifies:
  78. //
  79. //  Algorithm:
  80. //
  81. //  History:    4-29-93   RichardW   Created
  82. //
  83. //  Notes:
  84. //
  85. //----------------------------------------------------------------------------
  86. void
  87. LogEvent(   long            Mask,
  88.             const char *    Format,
  89.             ...)
  90. {
  91.     va_list ArgList;
  92.     int     Level = 0;
  93.     int     PrefixSize = 0;
  94.     char    szOutString[256];
  95.     long    OriginalMask = Mask;
  96.     if (Mask & GINAInfoLevel)
  97.     {
  98.         while (!(Mask & 1))
  99.         {
  100.             Level++;
  101.             Mask >>= 1;
  102.         }
  103.         if (Level >= (sizeof(DebLevel) / sizeof(char *)) )
  104.         {
  105.             Level = (sizeof(DebLevel) / sizeof(char *)) - 1;
  106.         }
  107.         //
  108.         // Make the prefix first:  "Process.Thread> GINA-XXX"
  109.         //
  110.         PrefixSize = sprintf(szOutString, "%d.%d> %s: ",
  111.                 GetCurrentProcessId(), GetCurrentThreadId(), DebLevel[Level]);
  112.         va_start(ArgList, Format);
  113.         if (_vsnprintf(&szOutString[PrefixSize], sizeof(szOutString) - PrefixSize,
  114.                             Format, ArgList) < 0)
  115.         {
  116.             //
  117.             // Less than zero indicates that the string could not be
  118.             // fitted into the buffer.  Output a special message indicating
  119.             // that:
  120.             //
  121.             OutputDebugStringA("GINA!LogEvent:  Could not pack string into 256 bytesn");
  122.         }
  123.         else
  124.         {
  125.             OutputDebugStringA(szOutString);
  126.         }
  127.         if (LogFile)
  128.         {
  129.             SYSTEMTIME  stTime;
  130.             GetLocalTime(&stTime);
  131.             fprintf(LogFile, "%02d:%02d:%02d.%03d: %sn",
  132.                     stTime.wHour, stTime.wMinute, stTime.wSecond,
  133.                     stTime.wMilliseconds, szOutString);
  134.             fflush(LogFile);
  135.         }
  136.     }
  137. }
  138. void
  139. OpenLogFile(LPSTR   pszLogFile)
  140. {
  141.     LogFile = fopen(pszLogFile, "a");
  142.     if (!LogFile)
  143.     {
  144.         OutputDebugStringA("GINA: Could not open logfile for append");
  145.         OutputDebugStringA(pszLogFile);
  146.     }
  147.     DebugLog((DEB_TRACE, "Log file '%s' beginsn", pszLogFile));
  148. }
  149. DWORD
  150. GetDebugKeyValue(
  151.     PDebugKeys      KeyTable,
  152.     int             cKeys,
  153.     LPSTR           pszKey)
  154. {
  155.     int     i;
  156.     for (i = 0; i < cKeys ; i++ )
  157.     {
  158.         if (strcmpi(KeyTable[i].Name, pszKey) == 0)
  159.         {
  160.             return(KeyTable[i].Value);
  161.         }
  162.     }
  163.     return(0);
  164. }
  165. //+---------------------------------------------------------------------------
  166. //
  167. //  Function:   LoadDebugParameters
  168. //
  169. //  Synopsis:   Loads debug parameters from win.ini
  170. //
  171. //  Effects:
  172. //
  173. //  Arguments:  (none)
  174. //
  175. //  Requires:
  176. //
  177. //  Returns:
  178. //
  179. //  Signals:
  180. //
  181. //  Modifies:
  182. //
  183. //  Algorithm:
  184. //
  185. //  History:    4-29-93   RichardW   Created
  186. //
  187. //  Notes:
  188. //
  189. //----------------------------------------------------------------------------
  190. void
  191. LoadDebugParameters(void)
  192. {
  193.     char    szVal[128];
  194.     char *  pszDebug;
  195.     int     cbVal;
  196.     cbVal = GetProfileStringA(szSection, "DebugFlags", "Error,Warning", szVal, sizeof(szVal));
  197.     pszDebug = strtok(szVal, ", t");
  198.     while (pszDebug)
  199.     {
  200.         GINAInfoLevel |= GetDebugKeyValue(DebugKeyNames, NUM_DEBUG_KEYS, pszDebug);
  201.         pszDebug = strtok(NULL, ", t");
  202.     }
  203.     cbVal = GetProfileStringA(szSection, "LogFile", "", szVal, sizeof(szVal));
  204.     if (cbVal)
  205.     {
  206.         OpenLogFile(szVal);
  207.     }
  208. }
  209. //+---------------------------------------------------------------------------
  210. //
  211. //  Function:   InitDebugSupport
  212. //
  213. //  Synopsis:   Initializes debugging support for the GINAgr
  214. //
  215. //  Effects:
  216. //
  217. //  Arguments:  (none)
  218. //
  219. //  Requires:
  220. //
  221. //  Returns:
  222. //
  223. //  Signals:
  224. //
  225. //  Modifies:
  226. //
  227. //  Algorithm:
  228. //
  229. //  History:    4-29-93   RichardW   Created
  230. //
  231. //  Notes:
  232. //
  233. //----------------------------------------------------------------------------
  234. void
  235. InitDebugSupport(void)
  236. {
  237.     LoadDebugParameters();
  238. }
  239. #else // DBG
  240. #pragma warning(disable:4206)   // Disable the empty transation unit
  241.                                 // warning/error
  242. #endif  // NOTE:  This file not compiled for retail builds