如何调试通过Windows Scheduler运行的exe?

时间:2009-02-26 03:11:15

标签: debugging windows-scheduler

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

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

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

5 个答案:

答案 0 :(得分:5)

您可以在程序中调用 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才能使用此函数)。

答案 1 :(得分:2)

请参阅此Stack Overflow问题 How Can I Use DebugBreak in C#

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

这种方法有几个问题:

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

答案 4 :(得分:0)

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