我正在使用Windows Scheduler来运行我编写的exe.
当调度程序启动我的exe时,如何跳转到调试会话?
更新1. 我曾想过做一个Thread.Sleep,然后选择Attach to Process.当我尝试它时,它说调试器已经附加到进程...
你可以从你的程序中调用DebugBreak().
根据MSDN页面,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才能使用此函数).