{"id":490,"date":"2009-08-09T18:50:15","date_gmt":"2009-08-09T16:50:15","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=490"},"modified":"2009-08-08T14:43:02","modified_gmt":"2009-08-08T12:43:02","slug":"vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2009\/08\/09\/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version\/","title":{"rendered":"VS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version"},"content":{"rendered":"<p>Wer wollte nicht schon immer mal gerne <em>TRACE (Debug)<\/em>-Ausgaben in seinem Release Programm haben ohne daf\u00fcr \u00fcberall <em>OutputDebugString <\/em>reinschreiben zu m\u00fcssen.<\/p>\n<p>Die nachfolgene kleine Klasse macht es m\u00f6glich, den gewohnten Syntax des <em>MFC TRACE <\/em>Makros zu verwenden und direkt auf die Debugausgabe umzuleiten:<\/p>\n<pre lang=\"cpp\">\/\/\u00a0\u00a0\u00a0 CTraceToOutputDebugString\r\n\/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Is a nice replacment class for TRACE\r\n\/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Easy to use with:\r\n\/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 #undef TRACE\r\n\/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 #define TRACE\u00a0\u00a0\u00a0 CTraceToOutputDebugString()\r\n\r\nclass CTraceToOutputDebugString\r\n{\r\npublic:\r\n    \/\/ Non Unicode output helper\r\n\u00a0\u00a0\u00a0 void operator()(PCSTR pszFormat, ...)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 va_list ptr;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 va_start(ptr, pszFormat);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TraceV(pszFormat,ptr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 va_end(ptr);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Unicode output helper\r\n    void operator()(PCWSTR pszFormat, ...)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 va_list ptr;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 va_start(ptr, pszFormat);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TraceV(pszFormat,ptr);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 va_end(ptr);\r\n\u00a0\u00a0\u00a0 }\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0 \/\/ Non Unicode output helper\r\n\u00a0\u00a0\u00a0 void TraceV(PCSTR pszFormat, va_list args)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Format the output buffer\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 char szBuffer[1024];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _vsnprintf(szBuffer, _countof(szBuffer), pszFormat, args);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutputDebugStringA(szBuffer);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n    \/\/ Unicode output helper\r\n\u00a0\u00a0\u00a0 void TraceV(PCWSTR pszFormat, va_list args)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wchar_t szBuffer[1024];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _vsnwprintf(szBuffer, _countof(szBuffer), pszFormat, args);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutputDebugStringW(szBuffer);\r\n\u00a0\u00a0\u00a0 }\r\n};<\/pre>\n<p>Durch den obenstehenden Code kann man auch in einer Release Version Trace Ausgaben erzeugen und z.B. mit <a href=\"http:\/\/technet.microsoft.com\/en-us\/sysinternals\/bb896647.aspx\">DebugView.exe (Sysinternals)<\/a> sichtbar machen, ohne evtl. weitere Anpassungen vornehmen zu m\u00fcssen:<\/p>\n<pre lang=\"cpp\">\/\/ Activate my special tracer\r\n#undef TRACE\r\n#define TRACE    CTraceToOutputDebugString()\r\n\r\nvoid Foo()\r\n{\r\n     \/\/ Sometime usefull to see the output in a release version too\r\n     TRACE(__FUNCTION__ \" called at %d\\n\", GetTickCount());\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Wer wollte nicht schon immer mal gerne TRACE (Debug)-Ausgaben in seinem Release Programm haben ohne daf\u00fcr \u00fcberall OutputDebugString reinschreiben zu m\u00fcssen. Die nachfolgene kleine Klasse macht es m\u00f6glich, den gewohnten Syntax des MFC TRACE Makros zu verwenden und direkt auf die Debugausgabe umzuleiten: \/\/\u00a0\u00a0\u00a0 CTraceToOutputDebugString \/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Is a nice replacment class for TRACE \/\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Easy &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2009\/08\/09\/vs-tippstricks-einfache-ausgabe-mit-trace-auch-in-der-release-version\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVS-Tipps&#038;Tricks: Einfache Debug-Ausgabe mit TRACE auch in der Release Version\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":[11,4,3,27,172,31,2],"tags":[370,38,352,136,37,61],"class_list":["post-490","post","type-post","status-publish","format-standard","hentry","category-debugging","category-mfc","category-programmieren","category-vs2008","category-vs2010","category-vs-tipps-tricks","category-windows-api","tag-c","tag-debuggen","tag-mfc","tag-qualitaetssicherung","tag-vs-tippstricks","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/490","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=490"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/490\/revisions"}],"predecessor-version":[{"id":507,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/490\/revisions\/507"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=490"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}