代码之家  ›  专栏  ›  技术社区  ›  Brian R. Bondy

在VC++中,在正确的时间点将调试器附加到进程的最佳方法是什么?

  •  7
  • Brian R. Bondy  · 技术社区  · 17 年前

    调试时,有时需要附加一个已经运行的进程,而不是在调试器中启动应用程序。

    我自己经常使用Sleep()或MessageBox调用,以便更容易附加调试器。我担心其中一些可能最终会被用于源代码控制。

    在仍然延迟足够的时间以便可以将调试器附加到正在运行的进程的同时,要避免这种情况,最好的方法是什么?

    用一个 #ifdef _DEBUG 这是一种方法,但我想知道是否有更好的方法。

    在睡眠中,你也会遇到一个问题,那就是你可能无法及时入睡。使用MessageBox,您可能会遇到远程调试的问题,或者调试没有可见GUI的进程(例如在Vista上作为服务运行)

    7 回复  |  直到 17 年前
        1
  •  15
  •   Roman Kruglov    10 年前

    我有时使用的另一个变体是

    while( !::IsDebuggerPresent() )
        ::Sleep( 100 ); // to avoid 100% CPU load
    

    它应该静默地等待,直到您将调试器附加到进程。

        3
  •  9
  •   Roger Lipscombe    17 年前

    最简单的就是打电话 DebugBreak ,这相当于 __asm int 3 ,但也适用于其他体系结构(MSVC for x64不允许内联汇编,如果我没记错的话)。这将打开实时调试器窗口,您可以从已注册的调试器(即Visual Studio)中选择要附加到进程的调试器。

    Sleep #ifdef _DEBUG 围绕这一点,以确保您实际上没有附带此代码。

    一个问题:为什么不能从IDE运行代码?它是服务还是IIS加载的DLL或类似文件?

    在这种情况下,您可以查看 ImageFileExecutionOptions 注册表项,允许您在进程启动时附加调试器。

    如果为此使用cdb,则可以将其配置为WinDbg实例的服务器或客户端,并以这种方式进行调试。我在过去使用WinDbg作为内核调试器,并使用ImageFileExecutionOptions启动 ntsd -d

        4
  •  7
  •   JaredPar    17 年前

    Freddy和Reoa有正确的解决方案。但是我想添加一个不使用MessageBox的原因。

    1. 通过Windows消息进行通信

    我们最近在我们的代码库中做了一个更改,从不显示MessageBox,以便于出于这个原因中断。对于一个非平凡的应用程序,它会产生非常糟糕的行为。

        5
  •  2
  •   Rob Walker    17 年前

    #ifdef _DEBUG 这是个好主意。我们使用一个可以调用DebugBreak()的ASSERT宏,因此您可以只编写ASSERT(false)

    blog 和 MSDN 文档

        6
  •  1
  •   rama-jka toti    17 年前

    DebugBreak、\uu DebugBreak和朋友

    静态void timeToChase(){uuu asm{int 3;};}

        7
  •  1
  •   Aaron Saarela    17 年前
    __asm int 3 
    

        8
  •  1
  •   Some Guy    6 年前

    如果_debugbreak()或debugbreak()适合您,那么我认为这可能是最好的方法。

    但是,我遇到过一些情况,由于未知的原因,\uuu debugbreak()只是立即终止程序,而不是等待调试器连接。我尝试了各种方法来解决这个问题(注册表黑客等),但似乎没有任何效果。(可能与此相关的是,在本例中,我尝试调试的进程不是直接从命令行启动的,而是由Java程序启动的。)

    无论如何,在这种情况下,我使用了这种方法,似乎效果很好:

    void waitForDebuggerToConnect() {
        #ifdef _DEBUG
        static volatile bool spin = true;
        while (spin)
        {}
        #endif
    }
    

    推荐文章