{"id":654,"date":"2010-09-10T17:41:44","date_gmt":"2010-09-10T16:41:44","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=654"},"modified":"2010-08-27T17:43:02","modified_gmt":"2010-08-27T16:43:02","slug":"vs-tipps-tricks-mfcatl-tracing-selektiv-ein-und-ausschalten","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/09\/10\/vs-tipps-tricks-mfcatl-tracing-selektiv-ein-und-ausschalten\/","title":{"rendered":"VS-Tipps &#038; Tricks: MFC\/ATL Tracing selektiv ein und ausschalten"},"content":{"rendered":"<p>In <em>ATL<\/em> und <em>MFC<\/em> steckt ein ziemlich ausgekl\u00fcgelter Trace-Mechanismus. Wenn man sich das <strong><em>MFC &#8211; ATL Trace Tool<\/em> <\/strong>ansieht kann man zu allen m\u00f6glichen Kategorien Informationen in Debug Fenster ausgeben lassen.<br \/>\nAlleine die <em>MFC<\/em> hat 14 verschiedene Trace Kategorien. Darunter besonders interessante wie\u00a0<em>CommandRouting<\/em>, <em>AppMsg<\/em> und <em>WinMsg<\/em>. Die <em>ATL<\/em> hat weitere 27 Kategorien.<br \/>\nEs lohnt sich mal einen Blick in dieses Tool und die entsprechenden Ausgaben zu machen. Es geh\u00f6rt zu den oft unbekannten netten Helferlein, die leider mangels Bekanntheit selten benutzt werden.<\/p>\n<p>Um Fehler zu finden und einzugrenzen, sind mir jedoch oft eher zu viele Ausgaben vorhanden, als zu wenige. Zudem finde ich es manchmal unhandlich mit dem Trace-Tool die Nachrichten ab einem bestimmten Moment einzuschalten und wieder auszuschalten.<br \/>\nIch habe eine kleine Hilfsklasse gebaut,mit der man in jedem Szenario, jederzeit zu einem bestimmten Moment das Tracing im Code ein- und automatisch wieder ausschalten kann.<\/p>\n<pre lang=\"cpp\">class CDebugEnableTraceForCategory\r\n{\r\npublic:\r\n  CDebugEnableTraceForCategory(ATL::CTraceCategory &amp;category,\r\n           PCSTR pszPrompt=NULL,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UINT uiLevel=4,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ATL::ATLTRACESTATUS eStatus=ATL::ATLTRACESTATUS_ENABLED)\r\n    : m_category(category)\r\n    , m_uiSaveLevel(category.GetLevel())\r\n    , m_eSaveStatus(category.GetStatus())\r\n    , m_strPrompt(pszPrompt)\r\n  {\r\n    if (!m_strPrompt.IsEmpty())\r\n      TRACE(\"%s - Tracelevel %d\\n\", m_strPrompt.GetString(),uiLevel);\r\n    m_category.SetLevel(uiLevel);\r\n    m_category.SetStatus(eStatus);\r\n  }\r\n  ~CDebugEnableTraceForCategory()\r\n  {\r\n    m_category.SetLevel(m_uiSaveLevel);\r\n    m_category.SetStatus(m_eSaveStatus);\r\n    if (!m_strPrompt.IsEmpty())\r\n      TRACE(\"%s - Tracelevel %d\\n\", m_strPrompt.GetString(), m_uiSaveLevel);\r\n  }\r\nprivate:\r\n  \/\/ Data fields\r\n  ATL::CTraceCategory &amp;m_category;\r\n  ATL::ATLTRACESTATUS m_eSaveStatus;\r\n  UINT m_uiSaveLevel;\r\n  CStringA m_strPrompt;\r\n  \/\/ no copy operator\r\n  CDebugEnableTraceForCategory(const CDebugEnableTraceForCategory &amp;);\r\n  CDebugEnableTraceForCategory&amp; operator=(const CDebugEnableTraceForCategory &amp;);\r\n};<\/pre>\n<p>Mit dieser Klasse kann ich zum Beispiel alle Windows-Nachrichten an MFC Fenster bei einer bestimmen Aktion ausgeben lassen. Und wenn die Aktion fertig ist stopp auch das Tracing wieder.\u00a0<\/p>\n<p>Hier als Beispiel um alle Fensternachrichten in der Aktion LoadFrame zu Tracen:\u00a0<\/p>\n<pre lang=\"cpp\">void CMyApp::InitInstance()\r\n{\r\n...\r\n\u00a0\u00a0\u00a0 CDebugEnableTraceForCategory trace(traceWinMsg,\"messages in LoadFrame\");\r\n\u00a0\u00a0\u00a0 pMainFrame-&gt;LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW);\r\n...\r\n}<\/pre>\n<p>Weitere Infos in der MSDN findet man unter\u00a0ATL::CTraceCategory und ATLTRACE2 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dhxsse89(VS.100).aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/dhxsse89(VS.100).aspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In ATL und MFC steckt ein ziemlich ausgekl\u00fcgelter Trace-Mechanismus. Wenn man sich das MFC &#8211; ATL Trace Tool ansieht kann man zu allen m\u00f6glichen Kategorien Informationen in Debug Fenster ausgeben lassen. Alleine die MFC hat 14 verschiedene Trace Kategorien. Darunter besonders interessante wie\u00a0CommandRouting, AppMsg und WinMsg. Die ATL hat weitere 27 Kategorien. Es lohnt sich &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/09\/10\/vs-tipps-tricks-mfcatl-tracing-selektiv-ein-und-ausschalten\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVS-Tipps &#038; Tricks: MFC\/ATL Tracing selektiv ein und ausschalten\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25,30,11,4,3],"tags":[366,370,38,352,37],"class_list":["post-654","post","type-post","status-publish","format-standard","hentry","category-atl","category-c","category-debugging","category-mfc","category-programmieren","tag-atl","tag-c","tag-debuggen","tag-mfc","tag-vs-tippstricks"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=654"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/654\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=654"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}