在启动时将调试器附加到进程

时间:2012-03-03 19:31:12

标签: visual-studio debugging com activex

我正在尝试跟踪我们处理com对象时的错误。我们的程序是从我们的activeX控件启动的,当应用程序再次关闭时会出现一些问题。我想在我们的应用程序首次从OCX启动时,将visual studio(2008)调试器附加到我们的应用程序中。我怎么能这样做?

一些细节:

a)OCX和应用程序主要用c / c ++编写,只有一点c ++ / cli(在启动应用程序时不起作用)
b)如果我在程序运行时附加到程序,我会在olelock.cpp退出时得到一个断言

void AFXAPI AfxOleUnlockApp()  
{  
   AFX_MODULE_STATE* pModuleState = AfxGetModuleState();  
   ASSERT(pModuleState->m_nObjectCount != 0);  <--- Triggers this
   if (InterlockedDecrement(&pModuleState->m_nObjectCount) == 0)  
   {  
      // allow application to shut down when all the objects have  
      //  been released  
      ::AfxOleOnReleaseAllObjects();  
    }  
}

因此,当我首次从OCX启动时,我想将调试器附加到我们的程序中,这样我就可以尝试跟踪COM对象的生命周期。或许还有另一种方法来追踪这些物体?

1 个答案:

答案 0 :(得分:7)

gflags是一般情况下您会考虑的复杂场景。特别是this page用于在启动时无条件地调试应用程序。

然而,我认为这对你想要的东西来说太过分了。我通常只是在我的程序中转储一些代码,如果它是在DEBUG模式下构建并且在代码启动时按下F1键,它将等待附加调试器。像这样的代码不应该留下来,但它非常方便。

#ifdef _DEBUG
if ( ::GetAsyncKeyState( VK_F1 ) )
{
    while ( !::IsDebuggerPresent() )
        ::Sleep( 100 );
    ::DebugBreak();
}
#endif