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

Windows编程

开发平台:

Visual C++

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1995 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef _PSEUDO_DEBUG   // entire file
  12. #ifdef _PSEUDO_DEBUG
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. LONG AssertBusy = -1;
  17. LONG AssertReallyBusy = -1;
  18. BOOL AssertFailedLine(LPCSTR lpszFileName, int nLine)
  19. {
  20. TCHAR szMessage[_MAX_PATH*2];
  21. InterlockedDecrement(&AssertReallyBusy);
  22. // format message into buffer
  23. wsprintf(szMessage, _T("File %hs, Line %d"),
  24. lpszFileName, nLine);
  25. TCHAR szT[_MAX_PATH*2 + 20];
  26. wsprintf(szT, _T("Assertion Failed: %sn"), szMessage);
  27. OutputDebugString(szT);
  28. if (InterlockedIncrement(&AssertBusy) > 0)
  29. {
  30. InterlockedDecrement(&AssertBusy);
  31. // assert within assert (examine call stack to determine first one)
  32. DebugBreak();
  33. return FALSE;
  34. }
  35. // active popup window for the current thread
  36. HWND hWndParent = GetActiveWindow();
  37. if (hWndParent != NULL)
  38. hWndParent = GetLastActivePopup(hWndParent);
  39. // display the assert
  40. int nCode = ::MessageBox(hWndParent, szMessage, _T("Assertion Failed!"),
  41. MB_TASKMODAL|MB_ICONHAND|MB_ABORTRETRYIGNORE|MB_SETFOREGROUND);
  42. // cleanup
  43. InterlockedDecrement(&AssertBusy);
  44. if (nCode == IDIGNORE)
  45. return FALSE;   // ignore
  46. if (nCode == IDRETRY)
  47. return TRUE;    // will cause DebugBreak
  48. AfxAbort();     // should not return (but otherwise DebugBreak)
  49. return TRUE;
  50. }
  51. void Trace(LPCTSTR lpszFormat, ...)
  52. {
  53. va_list args;
  54. va_start(args, lpszFormat);
  55. int nBuf;
  56. TCHAR szBuffer[512];
  57. nBuf = _vstprintf(szBuffer, lpszFormat, args);
  58. ASSERT(nBuf < (sizeof(szBuffer)/sizeof(szBuffer[0])));
  59. CString strMessage;
  60. if (AfxGetApp() != NULL)
  61. strMessage = ((CString) (AfxGetApp()->m_pszExeName)) + _T(": ");
  62. strMessage += szBuffer;
  63. OutputDebugString(strMessage);
  64. va_end(args);
  65. }
  66. #endif // _PSEUDO_DEBUG