【问题标题】:Production time debugging - session 0 process生产时间调试 - session 0 进程
【发布时间】:2011-09-20 18:11:23
【问题描述】:

我有以下场景:

  • Windows 2008
  • 使用特定用户凭据(即不是系统帐户)运行的服务。
  • 该服务启动子进程
  • 子进程启动,一秒后得到异常并崩溃

我正在尝试将调试器附加到子进程并在它崩溃之前对其进行调试

我试图使用 gflags 并设置调试器。问题是该服务在会话 0 中运行,因此 Windbg 不可见。我无法将服务设置为“允许与桌面交互”,因为该服务不能使用本地系统帐户,而是必须使用特定用户的凭据。

我不确定它是否打算这样工作,但我也尝试使用 Windbg -pe 从另一个 Windbg 实例连接到会话 0 中的那个 windbg(所以我会运行两个 Windbg)。但它不起作用 - 第二个实例似乎无法停止进程并查看其调用堆栈。

任何想法如何在子进程崩溃之前将调试器附加到子进程以进行调试?

【问题讨论】:

    标签: debugging windbg


    【解决方案1】:

    您可以为此使用命令行调试器 cdb。 使用附加的 cdb 启动您的服务,并作为调试服务器启动。 可以添加以下命令

    "c:\program files\windows 调试工具\cdb" -server tcp:port=5500 -g -G

    到注册表项的注册表值Debugger(类型字符串)

    HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image 文件执行 选项\YourApplication.Exe

    然后用windbg连接调试服务器

    windbg -remote tcp:server=localhost,port=5500

    【讨论】:

    • +1。完成同样事情的更简单的方法是使用 gflags 并在 Image File 选项卡上设置 Debugger 字符串。确保使用正确的 gflags 位数来执行此操作,因为如果 32 位进程在 64 位操作系统中运行,则此注册表设置必须位于 Wow6432Node 下。
    【解决方案2】:

    另一种选择:

    WinDbg 自动启动时,确实是看不到的。但是,您可以将 ntsd 配置为您的 jit 调试器,并启用远程调试。然后,您可以将您的 WinDbg 连接到 ntsd 并远程调试该进程。详情见:Debugging a Service on Windows Vista

    【讨论】:

      【解决方案3】:

      为什么不从故障转储开始? http://www.codeproject.com/KB/debug/automemorydump.aspx

      【讨论】:

        【解决方案4】:

        Sleep(30000) 添加到您的子进程入口点。这将为您提供足够的时间来连接调试器。

        【讨论】:

        • 生产时调试是不可能的 - 不能只为调试而替换代码
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        • 2020-06-29
        • 1970-01-01
        相关资源
        最近更新 更多