获取Win32程序以在启动时请求调试器? 我们有一个C++ Win32应用程序,它使用Qt的QPo过程(无疑是CuraPATAGE过程的包装器)生成,一个次要的“从程序”。

获取Win32程序以在启动时请求调试器? 我们有一个C++ Win32应用程序,它使用Qt的QPo过程(无疑是CuraPATAGE过程的包装器)生成,一个次要的“从程序”。,c++,windows,visual-studio,qt,winapi,C++,Windows,Visual Studio,Qt,Winapi,遗憾的是,在使用Visual Studio 2008调试系统时,调试器不会自动附加到生成的进程 我知道可以使用u debugbreak()以编程方式触发调试器断点,但从程序是否可以在启动时立即弹出“选择要调试此程序的程序”窗口,因为此时我们必须手动连接到新进程?使用。您可以将Visual Studio实时调试器指定为要附加到进程的默认调试器 如果您喜欢使用,您还可以使用ntsd-o自动调试子进程。我从Jeffrey Richter的“Windows编程应用程序”中学到的另一个巧妙技巧 在DLL\

遗憾的是,在使用Visual Studio 2008调试系统时,调试器不会自动附加到生成的进程

我知道可以使用u debugbreak()以编程方式触发调试器断点,但从程序是否可以在启动时立即弹出“选择要调试此程序的程序”窗口,因为此时我们必须手动连接到新进程?

使用。您可以将Visual Studio实时调试器指定为要附加到进程的默认调试器


如果您喜欢使用,您还可以使用
ntsd-o
自动调试子进程。

我从Jeffrey Richter的“Windows编程应用程序”中学到的另一个巧妙技巧

  • 在DLL\u进程\u附加案例中的DLLMain()中,通过调用DebugBreak()创建一个DLL
  • 将路径添加到注册表中的新DLL(它是一个逗号分隔的列表):
  • HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit\U DLL 映像加载程序将创建您的进程并加载注册表中输入的所有DLL。这将调用DLLmain,您的断点将被命中


    注意:为了避免调试所有应用程序,请使用“GetModuleBasename”检查进程名称,并仅为感兴趣的进程调用断点。

    尝试在从属程序的开头添加asm int 3。使用调试符号编译并使用Visual Studio 2008作为JIT调试器。@toto:这基本上与调用DebugBreak()相同。您知道真正的悲剧在于存在操作系统级挂钩-当调试器创建一个进程时,它会指定标志,以便在启动子进程时自动通知它。10年后,我们的开发环境仍然不支持它们:(啊,太棒了,这当然有帮助了-它现在抛出了一个错误框(Windows找不到“”。请确保键入的名称正确等等)但是我现在肯定走上了正确的道路;非常感谢。是的,您想用jit调试器的实际路径来替换它。应该在c:\program files\microsoft visual等等中…因为这是一个有文档记录的技巧,它可能会继续工作。但是请注意,您会遇到持有加载程序锁的断点。 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs