{"id":212,"date":"2008-02-19T21:26:24","date_gmt":"2008-02-19T20:26:24","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2008\/02\/19\/debugging-und-asserts-in-services\/"},"modified":"2009-03-06T14:14:23","modified_gmt":"2009-03-06T13:14:23","slug":"debugging-und-asserts-in-services","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2008\/02\/19\/debugging-und-asserts-in-services\/","title":{"rendered":"Debugging und ASSERTs in Services"},"content":{"rendered":"<p>Ich habe in der letzten Zeit einige COM-PlugIns \u00a0und Service Komponenten entwickelt. Alles Teile von anderen Diensten und <em>TSPs<\/em> (<em>Tapi Service Provider<\/em>). D.h. alles ohne UI. Die ganze Maschinerie, die ich hierzu verwendete befand sich auf einem Windows 2003 R2 Server. Aufgrund bestimmter Hardware war ein virtueller Server zum Testen nicht drin.<br \/>\nMacht ja nix. Man kann ja auch mit Remote Desktop auf dem Server vom eigenen Platz aus arbeiten, ohne deshalb im klimatisierten und immer zu kaltem und au\u00dferdem viel zu lautem\u00a0Serverraum zu arbeiten&#8230;<\/p>\n<p>Ziemlich schnell nervte mich gleich ein bestimmtes Problem. Ein Service mit einer meiner Komponenten stand auf einmal.\u00a0Ich habe mich mit dem Debugger remote attached und merkte mehr oder weniger schnell, dass ein bestimmter Thread (von 67) auf einen <em>ASSERT <\/em>gelaufen war. D\u00e4mlicher Weise hatte der nun kein <em>DebugBreak<\/em> ausgel\u00f6st. Genaugenommen stand der Thread in einer MessageBox mit dem <em>ASSERT <\/em>Fenster, dass jeder kennt.<br \/>\nDa ich aber per Remote Session mit dem Server verbunden war sah ich diese nicht. W\u00e4re ich am prim\u00e4ren Monitor angemeldet gewesen, h\u00e4tte mich die MessageBox erreicht, daf\u00fcr trifft die <em>CRT <\/em>Vorsorge.<br \/>\nD\u00e4mlich! Mir w\u00e4re sogar ein Crash (mit Minidump nat\u00fcrlich) lieber gewesen. So stand der Service blockierte noch drei andere Sachen und es dauerte doch einige Zeit bis ich diesen stehenden Service als Ursache ausmachen konnte. W\u00e4re der Service gecrasht h\u00e4tte ich es in Sekunden mitbekommen.<\/p>\n<p>OK! Wie gestalte ich das System nun um, dass ein <em>ASSERT <\/em>immer einen <em>DebugBreak <\/em>ausl\u00f6st und keine <em>MessageBox<\/em>, die sowieso keiner zu sehen bekommt?<br \/>\nDas w\u00fcrde einen Minidump schreiben und wenn ich mit dem Debugger verbunden w\u00e4re, w\u00fcrde es sofort das System an der entsprechenden Stelle stoppen. Die MessageBox mit dem ASSERT brauche ich nicht.<\/p>\n<p>Ein wenig Lesen in der CRT Doku schadet nicht. Also hier die L\u00f6sung:<\/p>\n<p>Schritt 1: Wir verhindern, dass die entsprechende MessageBox erscheint und stellen entsprechend ein, dass der <em>ASSERT <\/em>in der Debug Ausgabe mit protokolliert wird. Und wenn man es hat auch noch will, zus\u00e4tzlich in einer Protokolldatei.<\/p>\n<pre lang=\"cpp\">_CrtSetReportMode(_CRT_ASSERT,_CRTDBG_MODE_DEBUG\/*|_CRTDBG_MODE_FILE*\/);<\/pre>\n<p>Schritt 2: Nun brauchen wir noch einen DebugBreak, der immer ausgel\u00f6st wird. Auch das ist kein Problem. Wir benutzen den Debug Report Hook:<\/p>\n<pre lang=\"cpp\">_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, MyDebugHook);<\/pre>\n<p><em>MyDebugHook<\/em> ist nun nichts weiter als eine kleine Funktion die nur eins enth\u00e4lt: den Aufruf der Funktion <em>DebugBreak();.<\/em><\/p>\n<p>So ausgestattet lassen sich Services im Debugmode weitaus besser entwickeln. Jetzt sorgen Sie wenigstens f\u00fcr einen anst\u00e4ndigen Crash (nat\u00fcrlich mit Dump), wenn es ASSERTet&#8230; <img src=\"http:\/\/blog.m-ri.de\/wp-includes\/images\/smilies\/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe in der letzten Zeit einige COM-PlugIns \u00a0und Service Komponenten entwickelt. Alles Teile von anderen Diensten und TSPs (Tapi Service Provider). D.h. alles ohne UI. Die ganze Maschinerie, die ich hierzu verwendete befand sich auf einem Windows 2003 R2 Server. Aufgrund bestimmter Hardware war ein virtueller Server zum Testen nicht drin. Macht ja nix. &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/02\/19\/debugging-und-asserts-in-services\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDebugging und ASSERTs in Services\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":[30,19,11,3,2],"tags":[360,38,61],"class_list":["post-212","post","type-post","status-publish","format-standard","hentry","category-c","category-crt","category-debugging","category-programmieren","category-windows-api","tag-crt","tag-debuggen","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\/212","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=212"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/212\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=212"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}