如何调试通过 Windows 调度程序运行的 exe? [复制]

Posted

技术标签:

【中文标题】如何调试通过 Windows 调度程序运行的 exe? [复制]【英文标题】:How do I debug an exe running through Windows Scheduler? [duplicate] 【发布时间】:2010-10-09 23:47:12 【问题描述】:

我正在使用 Windows Scheduler 运行我编写的 exe。

当调度程序启动我的 exe 时,如何跳转到调试会话?

更新 1。 我曾想过做一个 Thread.Sleep 然后附加到进程。当我尝试它时,它说调试器已经附加到进程......

【问题讨论】:

【参考方案1】:

您可以在程序中调用 DebugBreak()

根据MSDN page,DebugBreak 执行以下操作:

导致发生断点异常 在目前的过程中。这允许 调用线程发出信号 调试器来处理异常。

在中导致断点异常 另一个过程,使用 DebugBreakProcess 函数。

此时您可以附加调试器,并继续运行程序。

此解决方案的唯一问题是您需要在代码中设置 DebugBreak() 条件,这样它就不会在程序运行时每次中断。也许您可以通过环境变量、注册表设置或调度程序传递给程序以确保它在启动时中断的参数来实现这一点。

示例代码

这是一些未经测试的读取环境变量的示例代码:

int main()

    char *debugBreakChar = getenv("DEBUG_BREAK");
    int debugBreak = atoi(debugBreakChar);
    if (debugBreak)
    
        DebugBreak();
    

    // Rest of the program follows here

现在您需要做的就是将环境变量设置为系统变量,并确保可以从与调度程序相同的 shell 上下文访问它(重新启动将实现此目的):

set DEBUG_BREAK=1

现在程序将在启动时中断,允许您附加调试器。将环境变量更改为 0 或取消设置,将允许程序正常运行。

环境变量在这方面有点复杂,因为它们是基于上下文的,您需要知道调度程序从相同的环境上下文运行。注册表值比这更好,您可以在代码中使用RegQueryValueEx 读取注册表值(您需要包含 windows.h 才能使用此函数)。

【讨论】:

我点击了链接,但不确定如何实现...你能举一个代码示例吗?注意。 exe 是一个 C# 控制台应用程序 C#版本是System.Diagnostics.Debug.Break() 感谢您的回答...但我正在寻找已接受答案中的 C# 版本...不过您得到了支持! 我可能不应该假设您想要一个 C++ 答案。下次可能值得将您选择的语言作为标签 :-)【参考方案2】:

附加到进程将起作用(在 Visual Studio 中),但如果它是一个快速进程,您可能需要在代码开头添加一个 sleep 语句,以便您可以在它启动主逻辑之前附加。

【讨论】:

【参考方案3】:

您可以在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 下设置一个密钥,该密钥将在进程启动时将调试器附加到该进程。您可以在 KB Article 中阅读如何执行此操作。

这种方法有几个问题:

IFEO debugging does not work with pure managed debugging。您需要使用Interop Debugging 您可能需要将调试器远程连接到另一个会话,具体取决于调度程序以哪个用户身份启动您的应用程序。

要使用 VS 进行调试,您需要在可执行文件的 IFEO 选项中实际指定 g VSJitDebugger.exe。您还必须指定要手动使用的调试引擎。 More details here.

【讨论】:

【参考方案4】:

Visual Studio 调试菜单中的“附加到进程”。

【讨论】:

以上是关于如何调试通过 Windows 调度程序运行的 exe? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何判断 C#程序是不是处于调试状态

VC++ ATL编写的Windows系统服务程序如何运行设置断点调试

如何从 Windows 任务调度程序在(ubuntu bash windows 10)上运行程序

如何使用 Laravel 在 Windows 10 中运行任务调度程序

从 Windows 任务调度程序在虚拟环境中运行 python 脚本

如何解决 Windows 10 调度程序错误