如何本机附加到python进程?
Posted
技术标签:
【中文标题】如何本机附加到python进程?【英文标题】:How to attach to a python process natively? 【发布时间】:2019-01-03 20:08:56 【问题描述】:通过ctypes
在 Python 中通过 C 互操作使用了 C++ DLL。在某些时候,C++ 程序意识到它需要被调试。在这种情况下,我尝试调用 __debugbreak()
,但 Python 进程只是终止了。
如何调试 Python 使用的 C++ DLL?
有很多细节,我不确定还能提供什么 - 请在 cmets 中询问。
更新:当前目标平台是 Windows。我不能简单地使用 Visual Studio 附加到 Python 进程,因为一切都发生得很快。所以也许我需要在 Python 进程中引入一个暂停……但这看起来不是一个优雅的选择。我宁愿修复 Python 在调用 __debugbreak()
时终止的问题
【问题讨论】:
您的目标平台是什么?如果是 Unix,那么您可以使用gdb
附加到正在运行的 Python 进程并在共享库中设置断点。如果是 Windows,那么 this 可能会有所帮助。
@ChrisHunt,我已经更新了帖子。
您可以插入下一个调试代码 - do Sleep(100); while(!IsDebuggerPresent()); __debugbreak();
或者您可以说从 dll 调用 ZwSuspendProcess(NtCurrentProcess());__debugbreak();
,附加调试器,然后从单独的 util 代码调用 ZwResumeProcess(hProcess);
。存在许多调试选项
【参考方案1】:
根据@RbMm 的评论,这是一个对我来说似乎最方便的解决方案。
在 C++ 代码中编写以下函数并使其可以从 Python 调用:
#include <windows.h>
#include <string>
__declspec(dllexport) void debug_break()
if(!IsDebuggerPresent())
std::string message("The application has requested a debug for process ID=");
message += std::to_string(GetCurrentProcessId());
MessageBoxA(nullptr, message.c_str(), "Attach Debugger", 0);
__debugbreak();
【讨论】:
以上是关于如何本机附加到python进程?的主要内容,如果未能解决你的问题,请参考以下文章
如何在运行时确定您的 C++ 应用程序何时附加了 Visual Studio 调试器?