gpt4 book ai didi

c++ - 在调试中断期间释放资源(C++、MSVC)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:02 25 4
gpt4 key购买 nike

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

更一般地说,我可以在 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 调试器调用了这些方法。 las,他们没有!似乎 MSVC 调试器只是在断点位置插入 int 3 而没有调用任何处理方法。


编辑 4:阅读结构化异常及其与 DebugBreak 陷阱的交互也会导致死胡同:遇到断点时,中断 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 打开。旗帜。

关于c++ - 在调试中断期间释放资源(C++、MSVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35697926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com