Q193513: BUG: Breakpoints Not Hit in ATL MMC Snap-In

Article: Q193513
Product(s): Microsoft C Compiler
Version(s): 3.0,6.0
Operating System(s): 
Keyword(s): kbDebug kbVC600bug kbATL300 kbATL300bug kbFAQ kbGrpDSTools kbNoUpdate
Last Modified: 12-FEB-2002

-------------------------------------------------------------------------------
The information in this article applies to:

- The Microsoft Active Template Library (ATL) 3.0, used with:
   - Microsoft Visual C++, 32-bit Enterprise Edition, version 6.0 
   - Microsoft Visual C++, 32-bit Professional Edition, version 6.0 
   - Microsoft Visual C++, 32-bit Learning Edition, version 6.0 
   - The Integrated Debugger 
-------------------------------------------------------------------------------

SYMPTOMS
========

The debugger may not break on your breakpoints when you try to debug an ATL MMC
(Microsoft Management Console) Snap-In on a Windows NT 4.0 machine.

CAUSE
=====

The ATL Object Wizard adds code that registers objects differently. The About
object uses the DECLARE_REGISTRY() macro for registering itself. Other objects
in the same Snap-In use an .rgs file. As a result, the About object is
registered using a long file name (in the InprocServer32 key). Other objects are
registered with a short file name.

MMC first creates the About object and loads the DLL with the long file name.
When other objects are created by MMC, the DLL is reloaded in a different memory
location with the short file name. Debugger breakpoints (int 3 instructions) are
inserted in the context of the first DLL, so any code executed in the context of
the second DLL won't have any int 3 instructions, and therefore breakpoints are
not hit.

RESOLUTION
==========

You can use one of the following four workarounds:

- 

  Workaround 1
  ------------

  Use a directory and project name that does not use long file names.

- 

  Workaround 2
  ------------

  Change the About object to use the .rgs file as shown below:

  1. Create a new registry file and edit it as follows (replacing the CLSID and
     class name):

        HKCR
         {
            MyClassAbout.1 = s 'MyClassAbout Class'
            {
               CLSID = s '{22A88065-391D-11D2-8164-00C04F7948A7}'
               CurVer = s 'MyClassAbout.1'
            }
            NoRemove CLSID
            {
               ForceRemove
         {22A88065-391D-11D2-8164-00C04F7948A7} = s 'MyClassAbout Class'
               {
                  ProgID = s 'MyClassAbout.1'
                  VersionIndependentProgID = s 'MyClassAbout.1'
                  ForceRemove 'Programmable'
                  InprocServer32 = s '%MODULE%'
                  {
                     val ThreadingModel = s 'Both'
                  }
               }
            }
         }

  2. Save the new registry file as MyClassAbout.rgs and import this file into
     your project resource. Change its id to IDR_MYCLASSABOUT.

  3. Replace the DECLARE_REGISTRY line in the About class with the following:

  DECLARE_REGISTRY_RESOURCEID(IDR_MYCLASSABOUT)

  4. Rebuild all.

- 

  Workaround 3
  ------------

  Unregister the DLL and comment out the object entry for the About object when
  debugging.

- 

  Workaround 4
  ------------

  Use _asm int 3 or DebugBreak or ATLASSERT(0) to break into the debugger and
  set/re-enable your break points.

STATUS
======

Microsoft has confirmed this to be a problem in the Microsoft products that are
listed at the beginning of this article.

Additional query words: snapin

======================================================================
Keywords          : kbDebug kbVC600bug kbATL300 kbATL300bug kbFAQ kbGrpDSTools kbNoUpdate 
Technology        : kbVCsearch kbAudDeveloper kbATLsearch
Version           : :3.0,6.0
Issue type        : kbbug
Solution Type     : kbpending

=============================================================================