<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin&#039;s Blog &#187; Debugging</title>
	<atom:link href="http://blog.m-ri.de/index.php/category/programmieren/debugging/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.m-ri.de</link>
	<description>Gesammeltes aus dem Leben eines &#34;normalen&#34; Programmierers... :-)</description>
	<lastBuildDate>Sat, 04 Feb 2012 12:07:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>VS-Tipps &amp; Tricks: Debugger Pseudo Variablen</title>
		<link>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/</link>
		<comments>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 18:28:55 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[VC-2008]]></category>
		<category><![CDATA[VC-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=851</guid>
		<description><![CDATA[Die folgenden Variablen helfen mir immer wieder beim Debuggen und zeigen einem während des Debuggens in Watch-Window manch nützliche Information: $TID Die Thread ID des aktuellen Threads. Nützlich wenn man mehrere Threads debuggt und bestimmte Threads bei einem Breakpoint identifizieren muss. $HANDLES Die Anzahl der aktuell benutzen System-Handles des Prozesses. Handle Leaks lassen sich damit [...]]]></description>
			<content:encoded><![CDATA[<p>Die folgenden Variablen helfen mir immer wieder beim Debuggen und zeigen einem während des Debuggens in Watch-Window manch nützliche Information:</p>
<ul>
<li><strong><em>$TID<br />
</em></strong>Die Thread ID des aktuellen Threads. Nützlich wenn man mehrere Threads debuggt und bestimmte Threads bei einem Breakpoint identifizieren muss.</li>
<li><em><strong>$HANDLES</strong></em><br />
Die Anzahl der aktuell benutzen System-Handles des Prozesses. Handle Leaks lassen sich damit im Debugger leicht überwachen.</li>
<li><em><strong>$ERR<br />
</strong>GetLastError</em> leicht gemacht. Schlägt ein WinApi Befehl fehl, dann ist es schön das man sofort beim Debuggen im Watch-Window sehen kann was die Ursache war. Oft genug ist ja im Code selbst kein Aufruf von <em>GetLastError</em> vorhanden oder nötig.</li>
</ul>
<p>Siehe auch MSDN:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms164891.aspx">http://msdn.microsoft.com/en-us/library/ms164891.aspx</a></p>
<p>BTW: <em>WinDbg</em> hat noch einige mehr nette Pseudovariablen:<br />
<a href="http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/06/16/special-command-using-variables-and-retrieving-information-through-pseudo-registers.aspx">http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/06/16/special-command-using-variables-and-retrieving-information-through-pseudo-registers.aspx</a><br />
Schmerzhaft vermisse ich immer wieder <em>$PEB, $TEB, $TPID, $RA</em> im <em>Visual Studio, </em>komisch, dass es die nur im <em>WinDbg</em> gibt.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Auflösung des GetBuffer und GetAllocLength Rästels</title>
		<link>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/#comments</comments>
		<pubDate>Sat, 23 Jul 2011 16:16:09 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=880</guid>
		<description><![CDATA[Dann will ich mal das Problem lüften, dass sich mit diesem Code ergibt, dein ich meinem letzten Artikel vorgestellt habe: template &#60;class T&#62; void SecureClearString&#40;T &#38;strText&#41; &#123; ::SecureZeroMemory&#40;strText.GetBuffer&#40;0&#41;,strText.GetAllocLength&#40;&#41;&#41;; strText.Empty&#40;&#41;; &#125; Zuerst einmal liegt es nicht daran, dass es hier Template verwendet wurde. Ein Template wurde verwendet, weil in dem Code nicht nur CString, sondern implizit [...]]]></description>
			<content:encoded><![CDATA[<p>Dann will ich mal das Problem lüften, dass sich mit diesem Code ergibt, dein ich meinem <a href="http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/">letzten Artikel</a> vorgestellt habe:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Zuerst einmal liegt es nicht daran, dass es hier Template verwendet wurde.<br />
Ein Template wurde verwendet, weil in dem Code nicht nur <em>CString</em>, sondern implizit <em>CStringA</em> und <em>CStringW</em> verwendet wurde. Der Code sollte also mit beiden Typen funktionieren.</p>
<p>Und damit sind wir bei Problem 1, das auch gelöst wurde:<br />
Wenn ein <em>CStringW</em> verwendet wird, dann wird nur die Hälfte des Strings gelöscht, und nicht alles.</p>
<p>Das Szenario, dass zu einem miesen Crash führen kann, will ich nun in den einzelnen Schritten schildern (es wurde ja vermutet, dass es mit GetBuffer zusammenhängt und die Vermutung ist richtig):</p>
<ol>
<li>Der <em>CString</em> der mit diesem template behandelt wurde enthielt einen größeren <em>CString</em> und anschließend wurde ein kürzerer <em>CString</em> zugewiesen. Damit ist <em>GetAllocLength</em>&gt;<em>GetLength</em>.</li>
<li>Dieser <em>CString</em> wird nun an eine weitere Variable zugewiesen. Durch die Referenzzählung wird keine volle Kopie erzeugt.</li>
<li>Nun kommt unsere schöne Funktion ins Spiel und einer der beiden Strings wird mit dieser Template Funktion behandelt.</li>
<li>Die Funktion hat zwei Argumente, die von rechts nach links berechnet und auf den Stack geschoben werden.</li>
<li>D.h. Zuerst wird <em>GetAllocLength</em> ausgeführt. Und dies ergibt einen Wert für die Länge, der ursprünglich einmal in diese Variable passte.</li>
<li>Als zweites erfolgt nun der Aufruf von <em>GetBuffer</em>. Da wir aber einen <em>CString</em> haben, der mehrfach benutzt wird, muss nun ein Copy on Write erfolgen. D..h. der String wird kopiert und mit der jetzt benötigten Länge neu alloziert und der Zeiger auf diesen Speicher wird zurückgegeben, dieser ist aber eben kürzer als der ursprüngliche Puffer.</li>
<li>Und nun erfolgt der <em>memset</em>, auf einen Speicher der nur noch so groß ist wie der kurze String. Folgerichtig wird der Heap zerstört, weil der Speicher hinter dem String überschrieben wird.</li>
<li>Peng <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  Wir haben hier einen ganz miesen Seiteneffekt.</li>
</ol>
<p>Hier der Code, mit dem man den Crash gezielt nachbauen kann:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> Crash<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  CString str1 <span style="color: #000080;">=</span> _T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;12345678901234567890&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  str1 <span style="color: #000080;">=</span> _T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;123&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  CString str2 <span style="color: #000080;">=</span> str1<span style="color: #008080;">;</span>
  SecureClearString<span style="color: #008000;">&#40;</span>str1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Crash</span>
  SecureClearString<span style="color: #008000;">&#40;</span>str2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Der Vollständigkeit halber will ich aber auch noch ein Stück Code zegen, der es richtig macht:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// We need this only if there is a private buffer</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Execute GetBuffer first. This might cause a fork and may change</span>
    <span style="color: #666666;">// GetAllocLength.</span>
    T<span style="color: #008080;">::</span><span style="color: #007788;">XCHAR</span> <span style="color: #000040;">*</span>pBuffer <span style="color: #000080;">=</span> strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">size_t</span> iLen <span style="color: #000080;">=</span>strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>pBuffer,iLen<span style="color: #000040;">*</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>T<span style="color: #008080;">::</span><span style="color: #007788;">XCHAR</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p lang="cpp">PS: Der Leser kann sich denken, dass mich dieser Bug und die entsprechende Reproduktion einige Nerven gekostet haben.  Denn es war nicht einfach die Vorbedingung (erst langer String, dann kurzer String, dann Zuweisung) zu ermitteln. Und wie es oft so ist führen Heap-Fehler erst sehr verzögert zu einem Problem.<br />
Wen es genau interessiert: Ich habe ca 7 Stunden an dem Fall geknobelt und hatte 3 verschiedene Crashdumps zur Verfügung. Selbst konnte ich diesen Fehler in unserem Testfeld zuvor nicht erzeugen, weil eben nie alle Bedingungen erfüllt waren. Erst als mir klar war wo das Problem lag, gelang es mir natürlich auch sofort Eingaben zu erzeugen, die den Crash reproduzierten.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Wie man gezielt einen Breakpoint für einen Thread setzen kann</title>
		<link>http://blog.m-ri.de/index.php/2011/07/02/vs-tipps-tricks-wie-man-gezielt-einen-breakpoint-fur-einen-thread-setzen-kann/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/02/vs-tipps-tricks-wie-man-gezielt-einen-breakpoint-fur-einen-thread-setzen-kann/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 18:46:07 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Testen]]></category>
		<category><![CDATA[VS-2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=858</guid>
		<description><![CDATA[Wenn man eine Anwendung oder einen Dienst hat, der mit vielen Threads arbeitet, dann kann das Debuggen abenteuerlich werden. Besonders wenn viele Threads ein und die selbe Threadfunktion verwenden. Was macht man nun wenn man einen Thread isoliert hat und dessen Verhalten weiter prüfen möchte? Single-Stepping ist nicht drin, denn der Breakpoint würde auch jeden [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man eine Anwendung oder einen Dienst hat, der mit vielen Threads arbeitet, dann kann das Debuggen abenteuerlich werden. Besonders wenn viele Threads ein und die selbe Threadfunktion verwenden.<br />
Was macht man nun wenn man einen Thread isoliert hat und dessen Verhalten weiter prüfen möchte? Single-Stepping ist nicht drin, denn der Breakpoint würde auch jeden anderen Thread anhalten, der diese Code-Position erreicht.</p>
<p>Die nachfolgende Methode ist relativ einfach um gezielt einen Breakpoint für einen Thread zu setzen.<br />
Gehen wir mal davon aus, dass wir im Debugger einen Breakpoint haben und uns im Kontext des Threads befinden, den wir nun weiter verfolgen wollen.</p>
<ol>
<li>Zuallererst ermitteln wir die <em>Thread-Id</em>.<br />
Das geht elementar einfach über die Pseudo-Debugger-Variable <em>$TID</em>, die wir uns im Watch-Fenster, oder im Quick-View anzeigen lassen:<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2011/05/BP1.png"><img class="size-full wp-image-861 alignnone" title="BP1" src="http://blog.m-ri.de/wp-content/uploads/2011/05/BP1.png" alt="" width="501" height="219" /></a></li>
<li>Als nächstes modifizieren wir den Breakpoint so, dass er nur noch dann stoppt, wenn auch unser Thread diesen Breakpoint erreicht.<br />
Das erreichen wir über die Breakpoint-Eigenschaft Condition (rechter Mausklick, über das Kontextmenü):<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2011/05/BP2.png"><img class="alignnone size-full wp-image-862" title="BP2" src="http://blog.m-ri.de/wp-content/uploads/2011/05/BP2.png" alt="" width="472" height="320" /></a><br />
Hier geben wir einfach als Bedingung an, das $TID (also die Thread-ID) identisch sein muss, zu der ID des Threads, den wir beobachten wollen.</li>
<li>Den Rest macht der Debugger für uns, wenn wir wieder den Go-Befehl (F5) geben:<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2011/05/BP3.png"><img class="alignnone size-full wp-image-863" title="BP3" src="http://blog.m-ri.de/wp-content/uploads/2011/05/BP3.png" alt="" width="595" height="103" /></a></li>
</ol>
<p>Auf diese Weise kann man auch mehrere Threads einfach beobachten.</p>
<p>Hinweis:<br />
Dieses Verfahren ändert das Laufzeitverhalten des Programmes, denn der Breakpoint wird immer intern ausgeführt, egal welcher Thread diese Codestelle passiert. Nur ermittelt der Debugger dann die Bedingung returniert und lässt das Programm, dann weiterlaufen, wenn die Id nicht passt. Wird diese Codestelle sehr oft passiert, dann kann ist der Einfluss eines solchen Breakpoints nicht  unerheblich.</p>
<p>Alternativ, kann man in solch einem Fall auch ein Stück Code einsetzen, der die aktuelle Thread-ID gegen eine statische Variable testet und einen <em>DebugBreak </em>ausführt. Die statische Variable setzt man dann während der Debugsession auf die gwünschte Thread-ID über das Watch-Window oder den Quick-View</p>
<p>Weiterführende Infos zu Debugger-Pseudo-Variablen von Visual-Studio findet man hier:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms164891.aspx">http://msdn.microsoft.com/en-us/library/ms164891.aspx</a></p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/02/vs-tipps-tricks-wie-man-gezielt-einen-breakpoint-fur-einen-thread-setzen-kann/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Und auf einmal ging der Debugger in VS-2010 nicht mehr&#8230;</title>
		<link>http://blog.m-ri.de/index.php/2011/02/09/und-auf-einmal-ging-der-debugger-in-vs-2010-nicht-mehr/</link>
		<comments>http://blog.m-ri.de/index.php/2011/02/09/und-auf-einmal-ging-der-debugger-in-vs-2010-nicht-mehr/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 16:03:22 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=748</guid>
		<description><![CDATA[Ich wollte heute morgen einfach ein kleines Testprogramm debuggen. Der Build wurde normale durchgeführt, aber danach ging nichts mehr. VS meldete nurnoch lapidar: Microsoft Visual Studio is Busy Microsoft Visual Studio is waiting for an internal Operation to complete. If you regularly encounter this delay during normal usage. please report this problem to Microsoft. D.h. [...]]]></description>
			<content:encoded><![CDATA[<p>Ich wollte heute morgen einfach ein kleines Testprogramm debuggen. Der Build wurde normale durchgeführt, aber danach ging nichts mehr. VS meldete nurnoch lapidar:</p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2011/02/VSBUSY.png"><img class="size-full wp-image-749 alignnone" title="Busy" src="http://blog.m-ri.de/wp-content/uploads/2011/02/VSBUSY.png" alt="" width="290" height="91" /></a></p>
<blockquote><p>Microsoft Visual Studio is Busy<br />
Microsoft Visual Studio is waiting for an internal Operation to complete. If you regularly encounter this delay during normal usage. please report this problem to Microsoft.</p></blockquote>
<p>D.h. Visual Studio meldete nur noch, dass es beschäftigt wäre. Nach ein paar überlangen Sekunden/Minuten hatte sich dann zumindest der Bildschirm aufgebaut, wie ich es vom Debugger her gewohnt war.</p>
<p>Im Debug Ausgabefenster konnte ich nur sehen, dass er die Symbole der EXE geladen hat. Mehr nicht.<br />
Also <strong>DEVENV.EXE</strong> abgeschossen.<br />
Anders Mini-Projekt mit nur einer Consolen Ausgabe, kompiliert, Debuggen&#8230; gleiches Problem.<br />
Neustart.<br />
Gleiches Problem.  :shock:</p>
<p> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_idea.gif' alt=':idea:' class='wp-smiley' />  Ich starte DEVENV.EXE erneut, gehe auf <strong>Tools -&gt; Options -&gt; Debugging</strong> und sehe den Übeltäter:</p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2011/02/VSSETTINGS.png"><img class="alignnone size-full wp-image-750" title="VSSETTINGS" src="http://blog.m-ri.de/wp-content/uploads/2011/02/VSSETTINGS.png" alt="" width="606" height="230" /></a></p>
<p>Meine Server ziehen um, und ich habe zentral für alle Entwickler einen Symbol-Cache. Nun und dieser Server ist eben nicht mehr da. Also wurde für jede DLL die der Debugger gesucht hat ein Fileshare bemüht der ins Nirwana zeigte.</p>
<p>Wie so oft: Kleine Ursache &#8211; Fatale Wirkung!</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/02/09/und-auf-einmal-ging-der-debugger-in-vs-2010-nicht-mehr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nette Falle im SQL-Server: Der Kompatibilitätsgrad</title>
		<link>http://blog.m-ri.de/index.php/2010/09/22/nette-falle-im-sql-server-kompatibilitaetsgrad/</link>
		<comments>http://blog.m-ri.de/index.php/2010/09/22/nette-falle-im-sql-server-kompatibilitaetsgrad/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 20:34:18 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[MS-SQL]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=638</guid>
		<description><![CDATA[Nach einem der letzten Updates unserer Software meldete uns ein Kunde einen SQL Fehler, der bei einer bestimmten Operation auftrat. Er setzt den MS-SQL Server 2008 ein. OK, meine Testumgebung hat drei Server von SQL 2000, über 2005 bis 2008 R2. Keine der Testumgebungen brachte bei der entsprechenden gleichen Operation einen Fehler Gut oder besser schlecht&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Nach einem der letzten Updates unserer Software meldete uns ein Kunde einen SQL Fehler, der bei einer bestimmten Operation auftrat. Er setzt den <em>MS-SQL Server 2008 </em>ein.</p>
<p>OK, meine Testumgebung hat drei Server von <em>SQL 2000</em>, über <em>2005 </em>bis <em>2008 R2</em>. Keine der Testumgebungen brachte bei der entsprechenden gleichen Operation einen Fehler <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_confused.gif' alt=':-?' class='wp-smiley' />  Gut oder besser schlecht&#8230; Der Kunde bekommt nun eine Fehlermeldung und auch wenn Kunden meistens ja nicht recht haben wenn sie Fehler melden <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  schaute ich mir dennoch alle SQL Befehle etwas genauer an, die meine Software da auslöste.<br />
In dem entsprechenden Teil meiner wurde nach Benutzerangaben ein relativ komplexer Query durch einen Abfragegenerator zusammengebaut. Darunter fand sich auch der folgende Subquery, als Teil der gesamten Abfrage:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Id<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>tblXYZ<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> a
  <span style="color: #993333; font-weight: bold;">WHERE</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>a<span style="color: #66cc66;">..</span><span style="color: #66cc66;">&#91;</span>IdParent<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span>
       <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">..</span><span style="color: #66cc66;">&#91;</span>Id<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#91;</span>IdXYZ<span style="color: #66cc66;">&#93;</span>
            <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>tblSomething<span style="color: #66cc66;">&#93;</span>
              <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#91;</span>IdParent<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Unschwer zu sehen werden hier mit dem Alias <strong><em>a</em></strong> zusammen irgendwie zwei Punkte verwendet. Bleibt die Frage warum in meiner Umgebung nun kein Fehler passiert und beim Kunden ein nun Syntax Fehler ausgelöst wird.</p>
<p>Nach einigem Suchen fand ich die Ursache im Kompatibilitätsgrad, den man im Managementstudio unter <em><strong>Datenbank -&gt; Datenbankname -&gt; Eigenschaften -&gt; Optionen </strong></em>je Datenbank separat einstellen kann. Dort sind folgende Einstellungen möglich.</p>
<p><em>SQL Server 2000 (80)<br />
SQL Server 2005 (90)<br />
SQL Server 2010 (100)</em></p>
<p>In meiner Testumgebung verwende ich eine Datenbank, die seit den ersten Anfängen unserer Software immer weiter als Testumgebung mit vielen Testdaten dient. Sie wurde erstmals auf einem <em>SQL Server 2000</em> angelegt. Dann auf einen <em>2005er</em> und schließlich auf einen <em>SQL Server 2008 R2</em> umgezogen. Netterweise &#8211; oder besser dummerweise &#8211; hat sich der <em>SQL Server </em>bei jeder Umstellung die ehemalige Kompatibilität gemerkt. Und man staunt nicht schlecht: Auf einem <em>SQL Server 2000</em> ist es kein Fehler zwischen Alias und Spaltennamen zwei Punkte zu schreiben. Bei einem <em>SQL Server 2005 </em>oder später ist das sehr wohl ein Syntaxfehler.<br />
Der Fehler lag also doch bei uns - was ja wirklich selten vorkommt <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  &#8211; und wurde trotz genauer Tests nicht entdeckt.</p>
<p>Man merke sich: <em>SQL Server</em> Syntax ist trotz gleicher <em>SQL Server</em> Version eben doch lange nicht das selbe.<br />
Wer also Software auf einem <em>SQL Server</em> testet sollte tunlichst darauf achten welchen Kompatibilitätsgrad er benutzt <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2010/09/22/nette-falle-im-sql-server-kompatibilitaetsgrad/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: MFC/ATL Tracing selektiv ein und ausschalten</title>
		<link>http://blog.m-ri.de/index.php/2010/09/10/vs-tipps-tricks-mfcatl-tracing-selektiv-ein-und-ausschalten/</link>
		<comments>http://blog.m-ri.de/index.php/2010/09/10/vs-tipps-tricks-mfcatl-tracing-selektiv-ein-und-ausschalten/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 16:41:44 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[ATL]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=654</guid>
		<description><![CDATA[In ATL und MFC steckt ein ziemlich ausgeklügelter Trace-Mechanismus. Wenn man sich das MFC &#8211; ATL Trace Tool ansieht kann man zu allen möglichen Kategorien Informationen in Debug Fenster ausgeben lassen. Alleine die MFC hat 14 verschiedene Trace Kategorien. Darunter besonders interessante wie CommandRouting, AppMsg und WinMsg. Die ATL hat weitere 27 Kategorien. Es lohnt sich [...]]]></description>
			<content:encoded><![CDATA[<p>In <em>ATL</em> und <em>MFC</em> steckt ein ziemlich ausgeklügelter Trace-Mechanismus. Wenn man sich das <strong><em>MFC &#8211; ATL Trace Tool</em> </strong>ansieht kann man zu allen möglichen Kategorien Informationen in Debug Fenster ausgeben lassen.<br />
Alleine die <em>MFC</em> hat 14 verschiedene Trace Kategorien. Darunter besonders interessante wie <em>CommandRouting</em>, <em>AppMsg</em> und <em>WinMsg</em>. Die <em>ATL</em> hat weitere 27 Kategorien.<br />
Es lohnt sich mal einen Blick in dieses Tool und die entsprechenden Ausgaben zu machen. Es gehört zu den oft unbekannten netten Helferlein, die leider mangels Bekanntheit selten benutzt werden.</p>
<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 />
Ich 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>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> CDebugEnableTraceForCategory
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  CDebugEnableTraceForCategory<span style="color: #008000;">&#40;</span>ATL<span style="color: #008080;">::</span><span style="color: #007788;">CTraceCategory</span> <span style="color: #000040;">&amp;</span>category,
           PCSTR pszPrompt<span style="color: #000080;">=</span><span style="color: #0000ff;">NULL</span>,
           UINT uiLevel<span style="color: #000080;">=</span><span style="color: #0000dd;">4</span>,
           ATL<span style="color: #008080;">::</span><span style="color: #007788;">ATLTRACESTATUS</span> eStatus<span style="color: #000080;">=</span>ATL<span style="color: #008080;">::</span><span style="color: #007788;">ATLTRACESTATUS_ENABLED</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008080;">:</span> m_category<span style="color: #008000;">&#40;</span>category<span style="color: #008000;">&#41;</span>
    , m_uiSaveLevel<span style="color: #008000;">&#40;</span>category.<span style="color: #007788;">GetLevel</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    , m_eSaveStatus<span style="color: #008000;">&#40;</span>category.<span style="color: #007788;">GetStatus</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    , m_strPrompt<span style="color: #008000;">&#40;</span>pszPrompt<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>m_strPrompt.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
      TRACE<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s - Tracelevel %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, m_strPrompt.<span style="color: #007788;">GetString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,uiLevel<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    m_category.<span style="color: #007788;">SetLevel</span><span style="color: #008000;">&#40;</span>uiLevel<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    m_category.<span style="color: #007788;">SetStatus</span><span style="color: #008000;">&#40;</span>eStatus<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  ~CDebugEnableTraceForCategory<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    m_category.<span style="color: #007788;">SetLevel</span><span style="color: #008000;">&#40;</span>m_uiSaveLevel<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    m_category.<span style="color: #007788;">SetStatus</span><span style="color: #008000;">&#40;</span>m_eSaveStatus<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>m_strPrompt.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
      TRACE<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s - Tracelevel %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, m_strPrompt.<span style="color: #007788;">GetString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, m_uiSaveLevel<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
  <span style="color: #666666;">// Data fields</span>
  ATL<span style="color: #008080;">::</span><span style="color: #007788;">CTraceCategory</span> <span style="color: #000040;">&amp;</span>m_category<span style="color: #008080;">;</span>
  ATL<span style="color: #008080;">::</span><span style="color: #007788;">ATLTRACESTATUS</span> m_eSaveStatus<span style="color: #008080;">;</span>
  UINT m_uiSaveLevel<span style="color: #008080;">;</span>
  CStringA m_strPrompt<span style="color: #008080;">;</span>
  <span style="color: #666666;">// no copy operator</span>
  CDebugEnableTraceForCategory<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> CDebugEnableTraceForCategory <span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  CDebugEnableTraceForCategory<span style="color: #000040;">&amp;</span> operator<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> CDebugEnableTraceForCategory <span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<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. </p>
<p>Hier als Beispiel um alle Fensternachrichten in der Aktion LoadFrame zu Tracen: </p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> CMyApp<span style="color: #008080;">::</span><span style="color: #007788;">InitInstance</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
...
    CDebugEnableTraceForCategory trace<span style="color: #008000;">&#40;</span>traceWinMsg,<span style="color: #FF0000;">&quot;messages in LoadFrame&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    pMainFrame<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>LoadFrame<span style="color: #008000;">&#40;</span>IDR_MAINFRAME,WS_OVERLAPPEDWINDOW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
...
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Weitere Infos in der MSDN findet man unter ATL::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>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2010/09/10/vs-tipps-tricks-mfcatl-tracing-selektiv-ein-und-ausschalten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie man den Namen einer RegisterWindowMessage bekommt</title>
		<link>http://blog.m-ri.de/index.php/2010/06/23/wie-man-den-namen-einer-registerwindowmessage-bekommt/</link>
		<comments>http://blog.m-ri.de/index.php/2010/06/23/wie-man-den-namen-einer-registerwindowmessage-bekommt/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 19:08:02 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Win32]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=128</guid>
		<description><![CDATA[Manchmal muss man Software verstehen. D.h. auch andere Software, die man selbst nicht geschrieben hat In meinem Fall war es hier ein Client, den ich geschrieben habe, der eine andere Software startet. Diese Software verwendete interne Nachrichten zur Kommunikation, die mit RegisterWindowMessage registriert wurden. Ich wollte nun hier einen Eingriff machen, der ein Fehlverhalten unter [...]]]></description>
			<content:encoded><![CDATA[<p>Manchmal muss man Software verstehen. D.h. auch andere Software, die man selbst nicht geschrieben hat <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>In meinem Fall war es hier ein Client, den ich geschrieben habe, der eine andere Software startet. Diese Software verwendete interne Nachrichten zur Kommunikation, die mit RegisterWindowMessage registriert wurden. Ich wollte nun hier einen Eingriff machen, der ein Fehlverhalten unter <em>Windows 7</em> und <em>Vista</em> vermeiden soll.</p>
<p>Hilfreich wäre für mich nun gewesen an den Namen der registrierten Nachrichten zu kommen. <em>Spy++</em> kann es auch und der importiert auch keine mystischen Funktionen. Also muss es einfach gehen.</p>
<p>Und ein wenig Recherche und ein Verweis eines Community Eintrags brachte mich auf diesen Thread:<br />
<a href="http://groups.google.it/group/microsoft.public.vc.mfc/browse_thread/thread/f83f7c12c80e4ada/460bc4c43a844a37">http://groups.google.it/group/microsoft.public.vc.mfc/browse_thread/thread/f83f7c12c80e4ada/460bc4c43a844a37</a></p>
<p>Siehe da <a href="http://msdn.microsoft.com/en-us/library/ms649040(v=VS.85).aspx" target="_self">GetClipboardFormatName</a> löst das Problem. Der nachfolgende Code lieferte mir nun im Detail, was das so hin und her läuft und der Name der Nachrichten war zum Glück sprechend. Ich konnte das Problem lösen.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>uiMsg<span style="color: #000080;">&gt;=</span><span style="color: #208080;">0xC000</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  TCHAR szName<span style="color: #008000;">&#91;</span>MAX_PATH<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  <span style="color: #008080;">::</span><span style="color: #007788;">GetClipboardFormatName</span><span style="color: #008000;">&#40;</span>uiMsg,szName,MfxCountOf<span style="color: #008000;">&#40;</span>szName<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  TCHAR szOut<span style="color: #008000;">&#91;</span>MAX_PATH<span style="color: #000040;">*</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  _stprintf<span style="color: #008000;">&#40;</span>szOut,_T<span style="color: #008000;">&#40;</span>__FUNCTION__<span style="color: #008000;">&#41;</span> _T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot; %s, wp=0x%08x, lp=0x%08x<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span>,
            szName, wParam, lParam<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  OutputDebugString<span style="color: #008000;">&#40;</span>szOut<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2010/06/23/wie-man-den-namen-einer-registerwindowmessage-bekommt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Format Specifier in den Debugger Fenstern</title>
		<link>http://blog.m-ri.de/index.php/2009/09/23/vs-tipps-tricks-format-specifier-in-den-debugger-fenstern/</link>
		<comments>http://blog.m-ri.de/index.php/2009/09/23/vs-tipps-tricks-format-specifier-in-den-debugger-fenstern/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 19:36:52 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=474</guid>
		<description><![CDATA[Beim Debuggen Variablen im Watch-Window oder im Quick-View anzeigen zu lassen ist gängige Praxis und jeder etwas fortgeschrittene Entwickler wird diese Funktionen des Visual-Studios nutzen. Üblicherweise wählt der Debugger eine Darstellungsform, die für die Variable geeignet ist. Besonders für STL Datentypen hat sich hier einiges getan seit VC-2005. Dennoch kann man dem Debugger für manche [...]]]></description>
			<content:encoded><![CDATA[<p>Beim Debuggen Variablen im Watch-Window oder im Quick-View anzeigen zu lassen ist gängige Praxis und jeder etwas fortgeschrittene Entwickler wird diese Funktionen des <em>Visual-Studios </em>nutzen.</p>
<p>Üblicherweise wählt der Debugger eine Darstellungsform, die für die Variable geeignet ist. Besonders für <em>STL </em>Datentypen hat sich hier einiges getan seit <em>VC-2005</em>.</p>
<p>Dennoch kann man dem Debugger für manche Datentypen noch einen <em>Format Specifier </em>mitgeben, der einem die Arbeit beim Debuggen extrem erleichert.<br />
<em>Format Specifier </em>erlauben es eine Variable entsprechend Ihrer Verwendung zu interpretieren. Typisch hier wäre eine Windows Nachricht. Als Integer sagt einem <em>0&#215;0129 </em>nicht viel, aber <em>WM_NCCREATE </em>einiges. Wenn man hinter die Variable <em>nMsg </em>im Watch-Fenster einfach aus nMsg,wm erweitert erhält man sofort die Nachricht als symbolischen Wert angezeigt.</p>
<p>Ich will hier nicht alle aber wenigstens ein paar sehr nützliche und weniger bekannte Format Specifier aufzählen:</p>
<p><strong><em>!</em></strong> &#8211; Raw format<br />
<strong><em>hr</em></strong> &#8211; HRESULT in Klartext<br />
<strong><em>su</em></strong> -Unicode<br />
<strong><em>s8</em></strong> &#8211; UTF8<br />
<strong><em>wm</em></strong> &#8211; Windowsnachricht<br />
<strong><em>wc</em></strong> &#8211; Fensterstil<br />
<strong><em>&lt;n&gt;</em></strong> &#8211; Anzahl der Arrayelemente</p>
<p>Am schönsten sieht man die Wirkung an dem folgenden Code und den nachfolgenden Bildern der Watch-Windows:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> g_ai<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000dd;">4711</span>,
  <span style="color: #0000dd;">815</span>,
  <span style="color: #0000dd;">1234</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> _tmain<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, _TCHAR<span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">list</span> lst<span style="color: #008080;">;</span>
  lst.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  lst.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  DWORD dwHResult <span style="color: #000080;">=</span> <span style="color: #0000dd;">2147943623</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>szUnicode <span style="color: #000080;">=</span> L<span style="color: #FF0000;">&quot;Unicode ÄÖÜäöü&quot;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>szUTF8Code <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;Umlaute AE=<span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\x84</span> OE=<span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\x96</span> UE=<span style="color: #660099; font-weight: bold;">\xc3</span><span style="color: #660099; font-weight: bold;">\x9c</span>.&quot;</span><span style="color: #008080;">;</span>
  UINT winmsg <span style="color: #000080;">=</span> <span style="color: #0000dd;">125</span><span style="color: #008080;">;</span>
  DWORD winstyle <span style="color: #000080;">=</span> <span style="color: #208080;">0xA6730000</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>pi <span style="color: #000080;">=</span> g_ai<span style="color: #008080;">;</span>
&nbsp;
  DebugBreak<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Hier das Ganze die Daten im Watchwindow ohne Formatspecifier:</p>
<p><img class="alignnone size-full wp-image-526" title="Watch1" src="http://blog.m-ri.de/wp-content/uploads/2009/09/Watch11.PNG" alt="Watch1" width="591" height="270" /></p>
<p>Hier das Ganze mit:</p>
<p><img class="alignnone size-full wp-image-527" title="Watch2" src="http://blog.m-ri.de/wp-content/uploads/2009/09/Watch21.PNG" alt="Watch2" width="595" height="316" /></p>
<p>Weitere Links dazu:<br />
<a href="http://msdn.microsoft.com/en-us/library/75w45ekt.aspx">http://msdn.microsoft.com/en-us/library/75w45ekt.aspx</a><br />
<a href="http://blogs.msdn.com/vcblog/archive/2006/08/04/689026.aspx">http://blogs.msdn.com/vcblog/archive/2006/08/04/689026.aspx</a></p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2009/09/23/vs-tipps-tricks-format-specifier-in-den-debugger-fenstern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Crash durch unsachgemäßen Umgang mit PreTranslateMessage</title>
		<link>http://blog.m-ri.de/index.php/2009/09/05/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage/</link>
		<comments>http://blog.m-ri.de/index.php/2009/09/05/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 08:52:18 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=408</guid>
		<description><![CDATA[Neulich bei einem Codereview, lief mir Code in den beiden nachfolgenden Formen über meinen Monitor: BOOL CMyDialog::PreTranslateMessage&#40;MSG *pMsg&#41; &#123; // Translate Messages (ON_KEYDOWN -&#62; ON_COMMAND) TranslateAccelerator&#40;m_hWnd,m_hAccel,pMsg&#41;; // Let the ToolTip process this message. m_tooltip.RelayEvent&#40;pMsg&#41;; return __super::PreTranslateMessage&#40;pMsg&#41;; &#125; - bzw.  - BOOL CMyWnd::PreTranslateMessage&#40;MSG *pMsg&#41; &#123;   BOOL bResult = __super::PreTranslateMessage&#40;pMsg&#41;; DoSomething&#40;&#41;;   return bResult; &#125; Sieht OK [...]]]></description>
			<content:encoded><![CDATA[<p>Neulich bei einem Codereview, lief mir Code in den beiden nachfolgenden Formen über meinen Monitor:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyDialog<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Translate Messages (ON_KEYDOWN -&gt; ON_COMMAND)</span>
    TranslateAccelerator<span style="color: #008000;">&#40;</span>m_hWnd,m_hAccel,pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">// Let the ToolTip process this message.</span>
    m_tooltip.<span style="color: #007788;">RelayEvent</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> __super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>- bzw.  -</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyWnd<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  BOOL bResult <span style="color: #000080;">=</span> __super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  DoSomething<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> bResult<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Sieht OK aus, aber hier tritt ein grundsätzliches Problem auf:</p>
<p>In beiden Funktionen wird evtl. eine Nachricht behandelt. Allerdings wird in diesem Fall nicht umgehend die Funktion verlassen. Durch das Behandeln der Nachricht kann nämlich das Fenster/Objekt, zu dem <em>PreTranslateMessage</em> gehört, bereits zerstört sein. In diesem Fall kehrt <em>PreTranslateMessage</em> zurück und der <em>this</em> Zeiger ist bereits ungültig.</p>
<p>Es ist also imminent wichtig in dem Moment in dem erkannt wird, dass die Nachricht behandelt wurde, auch umgehend die Funktion mit TRUE zu verlassen und keine weitere Memberfunktion oder gar Membervariable mehr zu nutzen. Beides könnte zu einem üblen Crash führen.</p>
<p>Der korrekte Code sähe also so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyDialog<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Translate Messages (ON_KEYDOWN -&gt; ON_COMMAND)</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>TranslateAccelerator<span style="color: #008000;">&#40;</span>m_hWnd,m_hAccel,pMsg<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
  <span style="color: #666666;">// Let the ToolTip process this message.</span>
  m_tooltip.<span style="color: #007788;">RelayEvent</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> __super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>- oder -</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL CMyWnd<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>MSG <span style="color: #000040;">*</span>pMsg<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>__super<span style="color: #008080;">::</span><span style="color: #007788;">PreTranslateMessage</span><span style="color: #008000;">&#40;</span>pMsg<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #0000ff;">return</span> TRUE<span style="color: #008080;">;</span>
  DoSomething<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> FALSE<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p lang="cpp">PS: Beide Codeteile wurden durch Crashdumps aus <a href="https://winqual.microsoft.com/">WinQual </a>gefunden. Regelmäßig, alle 2 Monate schaue ich mir Dumps an, von den Top-Crashes, die dort verzeichnet sind, und mache entsprechende Code-Reviews.<br />
Der erste Code, stammte aus einem speziellen nicht modalen Dialog, der durch Drücken bestimmter Tastenkombinationen geschlossen und zerstört wurde.<br />
Der zweite Code stammte aus einem Popup-Fenster, dass auch durch Mausaktivitäten oder Tastendrücke zerstört wurde.<br />
Ich kann jedem nur raten WinQual auch zu nutzen, es dient der Qualtitätssicherung und man findet viele kleine Bugs, die manchen User ärgern, die aber nie sonst gemeldet würden.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2009/09/05/crash-durch-unsachgemaessen-umgang-mit-pretranslatemessage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Direkter Break in den Debugger bei einem ASSERT</title>
		<link>http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/</link>
		<comments>http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 14:10:31 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=509</guid>
		<description><![CDATA[ASSERTs in der MFC und in der CRT sind tolle Hilfsmittel, aber nicht selten verfälschen sie auch das Problem alleine dadurch, dass ein Fenster aufpoppt, wenn der ASSERT zuschlägt. Hat man nun einen Code, der in einem Tooltipp etwas Böses macht, dann wird der Tooltipp selbst aber schon wieder durch das erscheinen der ASSERT Meldung [...]]]></description>
			<content:encoded><![CDATA[<p><em>ASSERTs</em> in der <em>MFC </em>und in der <em>CRT </em>sind tolle Hilfsmittel, aber nicht selten verfälschen sie auch das Problem alleine dadurch, dass ein Fenster aufpoppt, wenn der <em>ASSERT </em>zuschlägt. Hat man nun einen Code, der in einem Tooltipp etwas Böses macht, dann wird der Tooltipp selbst aber schon wieder durch das erscheinen der <em>ASSERT </em>Meldung zerstört. Oder es wird ein neuer ASSERT ausgelöst. Der Callstack wird dadurch oft schwer zu lesen.<br />
Besonders heikel kann dies auch noch werden wenn man mehrere Threads hat. Gleichfalls problematisch ist, dass in dem Moment in dem die ASSERT Box auftaucht nun auch wieder alle Timer weiterlaufen und sehr eigentümliche Seiteneffekte weiter auslösen können, dito. Probleme in WM_PAINT Handlern, denn auch die lösen evtl. schon wieder Aktionen aus, die Variablen verändern.</p>
<p>Nett ist am ASSERT-Dialog natürlich die Möglichkeit Ignorieren zu sagen und das Programm weiter laufen zu lassen. Ganz besonders wenn man Debug Versionen im Testfeld mit Anwendern testet.</p>
<p>Dennoch bin ich bei Debug-Versionen dazu übergegangen <em>ASSERTs</em> direkt  crashen zu lassen, bzw. direkt einen Debug-Break auszulösen. Das erleichtert das Lesen des Crashdumps bzw. hilft auch beim Debuggen, weil man direkt an der Stelle steht wo es hakt und alle Fenster und Variableninhalte exakt noch so sind, wie Sie es beim Auftreten des Problems waren (Tooltips, Popups, Menüs etc.).</p>
<p>Der Code um das zu erreichen ist relativ simpel. Man verwendet dazu <a href="http://msdn.microsoft.com/en-us/library/94a21kwy(VS.80).aspx">_CrtSetReportHook2</a>. In dem Hook sagt man einfach was man gerne hätte. Nämlich bei einem <em>ASSERT</em> oder <em>ERROR</em> keinen Dialog sondern einen Break (<em>INT3</em>).</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifdef _DEBUG</span>
<span style="color: #0000ff;">int</span> __cdecl DebugReportHook<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> nReportType, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> , <span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> pnRet<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Stop if no debugger is loaded and do not assert, cause a crash</span>
  <span style="color: #666666;">// - returning TRUE indicates that we handled the problem, so no other hook</span>
  <span style="color: #666666;">//   needs to perform any action</span>
  <span style="color: #666666;">// - setting the target of *pnRet to TRUE indicates that the CRT should</span>
  <span style="color: #666666;">//   execute an INT3 and should crash or break into the debugger.</span>
  <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span>pnRet <span style="color: #000080;">=</span> nReportType<span style="color: #000080;">==</span>_CRT_ASSERT <span style="color: #000040;">||</span>
                  nReportType<span style="color: #000080;">==</span>_CRT_ERROR <span style="color: #008080;">?</span>
                            TRUE <span style="color: #008080;">:</span> FALSE<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #339900;">#endif</span>
&nbsp;
<span style="color: #0000ff;">void</span> SetBreakOnAssert<span style="color: #008000;">&#40;</span>BOOL bBreakOnAssert<span style="color: #ff0000; font-style: italic;">/* =FALSE */</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>  
<span style="color: #666666;">// Need to disable the ASSERT handler?</span>
<span style="color: #339900;">#ifdef _DEBUG  </span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>bBreakOnAssert<span style="color: #008000;">&#41;</span>   
    _CrtSetReportHook2<span style="color: #008000;">&#40;</span>_CRT_RPTHOOK_INSTALL, DebugReportHook<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
  <span style="color: #0000ff;">else</span>   
    _CrtSetReportHook2<span style="color: #008000;">&#40;</span>_CRT_RPTHOOK_REMOVE, DebugReportHook<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #339900;">#else</span>
  UNUSED_ALWAYS<span style="color: #008000;">&#40;</span>bBreakOnAssert<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #339900;">#endif</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Durch diese kleine Funktion <em>SetBreakOnAssert</em> kann man dieses Verhalten nun einfach ein- und ausschalten. Nähere Details stehen im Kommentar der Hook-Funktion.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2009/08/30/vs-tipps-tricks-direkter-break-in-den-debugger-bei-einem-assert/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

