如何本机附加到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进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何将新的 JVM 附加到生成的 Python 进程?

Android Studio 附加到进程未找到本机符号

如何在运行时确定您的 C++ 应用程序何时附加了 Visual Studio 调试器?

如何将 PostgreSQL 卷附加到使用 SBT 本机打包程序生成的 Docker 映像?

如何将跟踪侦听器附加到正在运行的进程?

如何附加到 LLDB 中的子进程