home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / m / msjmar93.zip / DIAG.ZIP / DIAG.CPP next >
C/C++ Source or Header  |  1993-03-01  |  7KB  |  305 lines

  1. // diag.cpp
  2. #include <afxcoll.h>
  3. #include <afxwin.h>
  4. #include "resource.h"
  5.  
  6. #include "diag.h"
  7.  
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char BASED_CODE THIS_FILE[] = __FILE__;
  11.  
  12. /////////////////////////////////////////////////////////////////////////////
  13. CTheApp theApp;
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16.  
  17. BEGIN_MESSAGE_MAP( CMainWindow, CFrameWnd )
  18.     ON_WM_PAINT()
  19.     ON_COMMAND( IDM_TRACE, OnTRACE )
  20.     ON_COMMAND( IDM_DUMP, OnDump )
  21.     ON_COMMAND( IDM_ASSERT, OnASSERT )
  22.     ON_COMMAND( IDM_VERIFY, OnVERIFY )
  23.     ON_COMMAND( IDM_IGNOREASSERT, OnIgnoreASSERT )
  24.     ON_COMMAND( IDM_GUARD, OnGuard )
  25.     ON_COMMAND( IDM_CHECKPOINT, OnCheckpoint )
  26.     ON_COMMAND( IDM_LEAK, OnLeak )
  27.     ON_COMMAND( IDM_HOOKALLOC, OnHookAlloc )
  28.     ON_COMMAND( IDM_DYNDUMP, OnDynDump )
  29.     ON_COMMAND( IDM_DUMPCLASS, OnDumpClass )
  30.     ON_COMMAND( IDM_BADCAST, OnBadCast )
  31.     ON_COMMAND( IDM_ITERATE, OnIterate )
  32.     ON_COMMAND( IDM_ABOUT, OnAbout )
  33. END_MESSAGE_MAP()
  34.  
  35.  
  36. CMainWindow::CMainWindow()
  37. {
  38.     LoadAccelTable( "MainAccelTable" );
  39.     Create( NULL, "Diagnostic Example Program",
  40.         WS_OVERLAPPEDWINDOW, rectDefault, NULL, "MainMenu" );
  41. }
  42.  
  43. void CMainWindow::OnAbout()
  44. {
  45.     CModalDialog about( "AboutBox", this );
  46.     about.DoModal();
  47. }
  48.  
  49. void CMainWindow::OnTRACE()
  50. {
  51.     TRACE( "Sample TRACE output with formating:  %d == 0x%x\n", 34, 34);
  52. }
  53. void CMainWindow::OnDump()
  54. {
  55.     CNoDump aNoDump;
  56.     CDump aDump(39);
  57.     TRACE( "Dumping a CNoDump which does not override Dump\n");
  58.     afxDump << aNoDump;
  59.     TRACE( "\nDumping a CDump which does override Dump\n");
  60.     afxDump << aDump;
  61.     TRACE( "\n" );
  62. }
  63.  
  64. void CMainWindow::OnASSERT()
  65. {
  66.     ASSERT(FALSE);
  67. }
  68.  
  69. void CMainWindow::OnVERIFY()
  70. {
  71.     VERIFY(FALSE);
  72. }
  73.  
  74. extern int afxIgnoreAssertCount;
  75. void CMainWindow::OnIgnoreASSERT()
  76. {
  77.     afxIgnoreAssertCount = 1;
  78.     ASSERT(FALSE);                            // Will be ignored
  79.     ASSERT( afxIgnoreAssertCount == 0 );      // Will be TRUE
  80. }
  81.  
  82. //////////////////////////////////////////////////////////////////////////////
  83.  
  84. void CMainWindow::OnGuard()
  85. {
  86.     TRACE( "Testing the guard blocks\n" );
  87.     BYTE* p = new BYTE[10];
  88.     p[10]=0xC;
  89.  
  90.     if ( !AfxCheckMemory() )
  91.         TRACE("\tError Memory corrupt ( from program's TRACE )\n");
  92.  
  93.     afxMemDF |= checkAlwaysMemDF;
  94.  
  95.     delete p;
  96. }
  97.  
  98. //////////////////////////////////////////////////////////////////////////////
  99.  
  100. void CMainWindow::OnCheckpoint()
  101. {
  102.     CMemoryState first, second, diff;
  103.  
  104.     CString str = "Hello";
  105.     
  106.     first.Checkpoint();
  107.     CFile* pFile = new CFile();
  108.     BYTE* pBits = new BYTE[10];
  109.     second.Checkpoint();
  110.     if ( diff.Difference(first, second) )
  111.     {
  112.         TRACE("Dumping Difference stats between CheckPoints\n");
  113.         diff.DumpStatistics();
  114.         TRACE("\nDumping all objects from now back to first Checkpoint\n");
  115.         first.DumpAllObjectsSince();
  116.     }
  117.     TRACE("\nStats for all allocations from start to second Checkpoint.\n");
  118.     second.DumpStatistics();
  119. }
  120.  
  121. //////////////////////////////////////////////////////////////////////////////
  122.  
  123. void CMainWindow::OnLeak()
  124. {
  125.     TRACE( "Testing Memory Leak Detection\n" );
  126.  
  127.     afxMemDF |= delayFreeMemDF;
  128.     
  129.     CMemoryState first, second, diff;
  130.     char* ptr[10];
  131.     char * a = new char[20];
  132.     char * b = new char[20];
  133.     first.Checkpoint();
  134.     for (int i = 0; i<10; i++)
  135.         ptr[i] = new char[10];
  136.  
  137.     i=9;
  138.     while ( i > 0 )
  139.         delete ptr[i--];
  140.     
  141.     second.Checkpoint();
  142.     delete b;
  143.     if ( diff.Difference(first, second) )
  144.     {
  145.         TRACE("Dumping Difference stats between CheckPoints\n");
  146.         diff.DumpStatistics();
  147.         TRACE("\nDumping all objects from now back to first Checkpoint\n");
  148.         first.DumpAllObjectsSince();
  149.     }
  150. }
  151.  
  152. //////////////////////////////////////////////////////////////////////////////
  153.  
  154. AFX_ALLOC_HOOK pfnOldHook;
  155.  
  156. BOOL FAR PASCAL LogAllocs( size_t nSize, BOOL bObject, LONG lRequestNumber )
  157. {
  158.     TRACE( "Allocating a %s that is 0x%x - request #%ld\n",
  159.             bObject ? "Object" : "non-Object", nSize, lRequestNumber );
  160.     return (*pfnOldHook)(nSize, bObject, lRequestNumber);
  161. }
  162.                                                 
  163.  
  164. void CMainWindow::OnHookAlloc(void)
  165. {
  166.     pfnOldHook = AfxSetAllocHook( LogAllocs );
  167.     char* ptr = new char[10];
  168.     CString* str = new CString( "This string will cause an allocation too" );
  169.     CFile* pFile = new CFile();
  170. }
  171.  
  172. //////////////////////////////////////////////////////////////////////////////
  173.  
  174. IMPLEMENT_DYNAMIC( CDynDump, CObject )
  175.  
  176. void CMainWindow::OnDynDump()
  177. {
  178.     CDynDump aDump(39);
  179.     TRACE( "\nDumping a CDynDump which does override Dump\n");
  180.     afxDump << aDump;
  181.     TRACE( "\n" );
  182. }
  183.  
  184. //////////////////////////////////////////////////////////////////////////////
  185.  
  186. IMPLEMENT_DYNAMIC( CLevel1Object, CObject )
  187. IMPLEMENT_DYNAMIC( CLevel2Object, CLevel1Object )
  188.  
  189. void DumpTree(const CObject* pObject)
  190. {
  191.     CRuntimeClass* pClass = pObject->GetRuntimeClass();
  192.     TRACE( "a %s object\n", pClass->m_pszClassName );
  193.     pClass = pClass->m_pBaseClass;
  194.     while ( pClass != NULL )
  195.     {
  196.         TRACE("\tderived from %s\n",pClass->m_pszClassName);
  197.         pClass = pClass->m_pBaseClass;
  198.     }
  199. }
  200.  
  201. void CMainWindow::OnDumpClass(void)
  202. {
  203.     CObject* p1 = new CLevel1Object();
  204.     CObject* p2 = new CLevel2Object();
  205.  
  206.     DumpTree(p1);
  207.     DumpTree(p2);
  208.     DumpTree(this);
  209. }
  210.  
  211. //////////////////////////////////////////////////////////////////////////////
  212.  
  213. IMPLEMENT_DYNAMIC( CFoo, CObject )
  214. IMPLEMENT_DYNAMIC( CBar, CObject )
  215.  
  216. void CFooCounter(CFoo*)
  217. {
  218.     TRACE("Got a CFoo\n");
  219. }
  220. void CBarCounter(CBar*)
  221. {
  222.     TRACE("Got a CBar\n");
  223. }
  224.  
  225. void DoForFooOrBar( CObList* pList, void (*pfnCFooFunction)(CFoo*),
  226.         void (*pfnCBarFunction)(CBar*))
  227. {
  228.     POSITION pos = pList->GetHeadPosition();
  229.     while (pos != NULL )
  230.     {
  231.         CObject* pOb = pList->GetNext(pos);
  232.         if ( pOb->IsKindOf(RUNTIME_CLASS(CFoo) ) )
  233.             (*pfnCFooFunction)( (CFoo*)pOb );
  234.         if ( pOb->IsKindOf(RUNTIME_CLASS(CBar) ) )
  235.             (*pfnCBarFunction)( (CBar*)pOb );
  236.     }
  237. }
  238.  
  239. void CMainWindow::OnIterate(void)
  240. {
  241.     CObList aList;
  242.     aList.AddHead( new CFoo() );
  243.     aList.AddHead( new CBar() );
  244.     aList.AddHead( new CFoo() );
  245.     aList.AddHead( new CFoo() );
  246.     aList.AddHead( new CBar() );
  247.  
  248.     DoForFooOrBar( &aList, CFooCounter, CBarCounter );
  249. }
  250.  
  251. //////////////////////////////////////////////////////////////////////////////
  252.  
  253. IMPLEMENT_DYNAMIC( CValidOb, CObject )
  254. IMPLEMENT_DYNAMIC( CDerivedValidOb, CValidOb )
  255. IMPLEMENT_DYNAMIC( CNotValidOb, CObject )
  256.  
  257. void Helper(CObject* pObject)
  258. {
  259.     // ASSERT( pObject->IsKindOf(RUNTIME_CLASS(CFoo)) );
  260.     ((CValidOb*)pObject)->Print();
  261. }
  262.  
  263.  
  264. void CMainWindow::OnBadCast(void)
  265. {
  266.     CObject* p1 = new CValidOb();
  267.     CObject* p2 = new CDerivedValidOb();
  268.     CObject* p3 = new CNotValidOb();
  269.  
  270.     Helper(p1);
  271.     Helper(p2);
  272.     Helper(p3);
  273. }
  274.  
  275.     
  276. /////////////////////////////////////////////////////////////////////////////
  277. // CTheApp
  278.  
  279. BOOL CTheApp::InitInstance()
  280. {
  281.     m_pMainWnd = new CMainWindow();
  282.     m_pMainWnd->ShowWindow( m_nCmdShow );
  283.     m_pMainWnd->UpdateWindow();
  284.  
  285.     m_FirstMemCheck.Checkpoint();
  286.  
  287.     return TRUE;
  288. }
  289.  
  290. BOOL CTheApp::ExitInstance()
  291. {
  292. #ifdef _DEBUG
  293.     CMemoryState MemState2, DiffState;
  294.     
  295.     MemState2.Checkpoint();
  296.     
  297.     if ( !DiffState.Difference(m_FirstMemCheck, MemState2))
  298.     {
  299.         DiffState.DumpStatistics();
  300.         m_FirstMemCheck.DumpAllObjectsSince();
  301.     }
  302. #endif
  303.     return TRUE;
  304. }
  305.