我正在使用Windows Scheduler运行我编写的exe。
当调度程序启动我的exe时,如何跳转到调试会话?
更新1。 我曾想过做一个Thread.Sleep,然后选择Attach to Process。当我尝试它时,它说调试器已经附加到进程...
答案 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调试菜单中的“附加到进程”。