【问题标题】:Get a Win32 program to request a debugger on startup?获取 Win32 程序以在启动时请求调试器?
【发布时间】:2010-12-06 09:27:09
【问题描述】:

我们有一个使用 Qt 的 QProcess(无疑是 CreateProcess() 的包装器)生成的 C++ Win32 应用程序,这是一个辅助“从属”程序。

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

我知道可以使用 __debugbreak() 以编程方式触发调试器断点,但是从属程序是否有可能在启动时立即抛出“选择要调试的程序”窗口,因为此时我们必须比赛手动附加到新进程?

【问题讨论】:

  • 尝试在从属程序的开头添加_asm int 3。使用调试符号编译并使用 Visual Studio 2008 作为 JIT 调试器。
  • @toto:这基本上和调用 DebugBreak() 一样。
  • 你知道真正的悲剧是存在操作系统级别的钩子 - 当调试器创建一个进程时,它会指定标志,以便在启动子进程时自动通知它。 10 年后,我们的开发环境仍然不支持它们:(

标签: c++ windows visual-studio qt winapi


【解决方案1】:

使用Image File Execution Options。您可以将 Visual Studio 即时调试器指定为附加到进程的默认调试器。

如果您喜欢使用command-line debuggers,您也可以使用ntsd -o 来自动调试子进程。

【讨论】:

  • 啊太棒了,这肯定有帮助 - 它现在抛出一个错误框(Windows 找不到''。确保你输入了正确的名称等等等等)但我现在肯定走​​在正确的轨道上;非常感谢。
  • 是的,你想用你的 jit 调试器的实际路径替换它。应该在 c:\program files\microsoft visual blah blah blah...
【解决方案2】:

我从阅读 Jeffrey Richter 的“Programming Applications for Windows”中学到的另一个巧妙技巧

  1. 在 DLL_PROCESS_ATTACH 案例中的 DLLMain() 中调用 DebugBreak() 创建一个 DLL
  2. 在注册表中添加新 DLL 的路径(它是一个逗号分隔的列表):
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs

图像加载器将创建您的进程并加载在注册表中输入的所有 DLL。这将调用 DLLmain 并且您的断点将被命中。

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

【讨论】:

  • 由于这是一个记录在案的技巧,它很可能会继续有效。但请注意,您将遇到持有加载程序锁的断点。
猜你喜欢
  • 2015-03-29
  • 2011-07-16
  • 2012-05-09
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
相关资源
最近更新 更多