在调试中断期间释放资源(C,MSVC)

在调试器中停止程序时是否可以释放资源(文件锁定,定时器)?

更一般地说,我可以在MSVC停止程序调试和恢复执行之前执行代码吗?

我想完成一些事情:
   – 在调试期间自动释放文件锁以进行编辑.
   – 进程恢复后自动重新加载文件
   – 防止定时器在调试停止期间触发哪个溢出
   – 从计时器中减去调试所花费的时间

解决方法:如果在调试器停止程序之前我无法执行代码,那么在程序中以编程方式检测调试器停止应用程序将会有很大帮助.

编辑:
我查看了用于调试器集成的Windows API函数,但似乎函数如ContinueDebugEvent仅适用于调试器的编写器,而且从不用于正在调试的进程.

编辑2:
看起来,当调试器想要破坏进程时,对DbgBreakPoint函数进行热修补可能是一种拦截方法.

The main idea behind attaching is that a debugger calls the
“DebugActiveProcess” function which ends up with calling the
“RtlCreateUserThread” function to create a new remote thread into the
target process, with the “DbgUiRemoteBreakin” function as the new
thread entry point.

(自http://waleedassar.blogspot.de/2011/12/debuggers-anti-attaching-techniques.html起)

DbgUiRemoteBreakin似乎调用DbgBreakPoint来实际停止进程.

编辑3:
我对DbgBreakPoint和DebugBreak进行了热补丁,以查看当我以交互方式断开时是否从MSVC调试器调用这些方法.唉,他们没有!似乎MSVC调试器只是在断点位置插入int 3而不调用任何进程方法.

编辑4:
阅读结构化异常及其与DebugBreak陷阱的交互也会导致deadend:当遇到断点时,中断3将首先到达内核,然后首先将结构化异常传递给调试器(如果已连接).调试器处理中断,应用程序永远不会看到它.

最佳答案 免责声明:我自己使用单元测试而不是使用调试器进行深度攻击,但从不说永远不会.

Is it possible to release a resource (a file lock) while a program is
stopped in the debugger?

调试器不包含此类功能.最简单的是使用Process Explorer或其他类似的工具.但是,如果你继续
程序之后它不再有已释放的资源,后续尝试访问这些资源将失败.

More generically, could I execute code before MSVC stops the program
for debugging and after resuming execution?

您可以临时编辑代码,以便在计划在调试器中打破它的位置之前和之后执行您希望执行的操作.请不要忘记稍后删除此类临时代码.你也可以编辑数据的内容,甚至强制改变代码的执行顺序setting the next statement to execute,但这是正确的做法很棘手.

My program locks a file, which I would like to exchange during debugging.

通过打开OF_SHARE_DENY_NONE标志,还可以选择在调试时不锁定文件.

点赞