  | 
   MS Visual C++ Conditional Breakpoints 
   Submitted by  |   
  
  
There haven't been any tips for a while, so I thought I'd share this 
feature I found the other day.
  
I have a single class that implements a byte stream used all over the place 
which transfers data in a separate thread.  This thread moves all the data 
streams along their merry way (i.e. there's one static thread, not one 
thread for each object).  Wouldn't you know it, I had a bug I had to track 
down even though I thought the code was solid.  The problem was that I had 
to have at least 10 instances of this class to even run the program, and 
everything was happening in a different thread at a 10ms interval, so I 
couldn't just set a breakpoint in a method because it'd be impossible to 
track.  Enter conditional breakpoints:
  
[Note: this only applies to Microsoft Visual C++, sorry]
 
What you do is set a breakpoint where you normally would (F9).  Now, edit 
breakpoints (Alt-F9).  Select the breakpoint you just created, and hit the 
"Condition" tab to bring up the "Breakpoint Condition" dialog.  There are a 
couple things you can do from this dialog.  The most useful is that you can 
set a condition for the breakpoint.
  
For my problem, I set a breakpoint where I created the byte stream that I 
thought was causing the problem.  I noted its address in memory.  Then I 
went into the class code for my worker thread, and set a breakpoint with 
the condition "pByteStream == 0xAEF38201" (or whatever the address was of 
the offending stream) . Then I continue execution.  Like magic, the worker 
thread breaks when it gets to my offending stream, ignoring all the 
others.  I also used this to put breaks in the byte stream code itself with 
the condition "this == 0xAEF38201".
  
(Another nice thing is that, at least in debug builds, your program always 
allocates variables in the same place in memory if you follow the same 
execution path; you only have to manually check the address once).
  
The other options in this dialog allow you to declare the size of a 
dereferenced void pointer to use with a the compare logic, and allow you to 
set a number of times to skip the breakpoint before actually breaking (so 
you can look at the execution every Nth loop).
  
Granted, this is all documented and not a "secret", but it's something I'd 
never discovered until my back was against the wall.  Hope this helps with 
your debugging.
  
 | 
 
 
 
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
 
 
 |