在 Windows 上的 VSCode 中调试 Python C/C++ 扩展

2024-02-12

问题总结

我正在为 Python 开发一个自 C 扩展,以提高特定代码段的性能。我想调试这个扩展,但到目前为止还没有成功。我关注了几个链接,例如这是纳迪亚的 https://nadiah.org/2020/03/01/example-debug-mixed-python-c-in-visual-studio-code/ or 这是来自巴克的 https://bark-simulator.readthedocs.io/en/latest/debugging.html#debugging-c-and-python,但我总是遇到同样的问题:我无法在 C 代码的任何断点处停止。

我尝试过的方法

这个想法是将Python作为主进程运行,并将编译后的C代码附加到该主进程。接下来我留下一个最小可重复示例 https://stackoverflow.com/help/minimal-reproducible-example:

Python文件

import os
import greet

pid = os.getpid()

test=2.2

greet.greet('World')

print("hi")

正如你所看到的,我什至检索了进程ID,以便在附加C代码时在vscode中选择这个ID,如下所示:

C code

#include <Python.h>

static PyObject *
greet_name(PyObject *self, PyObject *args)
{
    const char *name;

    if (!PyArg_ParseTuple(args, "s", &name))
    {
        return NULL;
    }
    
    printf("Helllo %s!\n", name);

    Py_RETURN_NONE;
}

static PyMethodDef GreetMethods[] = {
    {"greet", greet_name, METH_VARARGS, "Greet an entity."},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef greet =
{
    PyModuleDef_HEAD_INIT,
    "greet",     /* name of module */
    "",          /* module documentation, may be NULL */
    -1,          /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
    GreetMethods
};

PyMODINIT_FUNC PyInit_greet(void)
{
    return PyModule_Create(&greet);
}

我通过运行 GCC 8.1 编译 C 代码python setup.py install:

安装文件

import os

from setuptools import setup, Extension

os.environ["CC"] = "g++-8.1.0"

_DEBUG = True
_DEBUG_LEVEL = 0
# extra_compile_args = sysconfig.get_config_var('CFLAGS').split()
extra_compile_args = ["-Wall", "-Wextra"]
if _DEBUG:
    extra_compile_args += ["-g3", "-O0", "-DDEBUG=%s" % _DEBUG_LEVEL, "-UNDEBUG"]
else:
    extra_compile_args += ["-DNDEBUG", "-O3"]

setup(
    name='greet',
    version='1.0',
    description='Python Package with Hello World C Extension',
    ext_modules=[
        Extension(
            'greet',
            sources=['greetmodule.c'],
            py_limited_api=True,
            extra_compile_args=extra_compile_args)
    ],
)

我什至指定O0拥有所有调试符号的选项。

启动 JSON 文件

"configurations": [
    {
        "name": "(gdb) Attach",
        "type": "cppdbg",
        "request": "attach",
        "program": "venv/Scripts/python",
        "processId": "${command:pickProcess}",
        "MIMode": "gdb",
        // "miDebuggerPath": "/path/to/gdb",
        "setupCommands": [
            {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            }
        ]
    },
    {
        "name": "Python: Current File",
        "type": "python",
        "request": "launch",
        "program": "${file}",
        "console": "integratedTerminal"
    }
]

我遵循的调试步骤

  1. 在 python 文件中添加断点,运行启动配置“Python: Current File”并等待到达断点。
  2. 运行“(gdb) Attach”启动配置,选择路径包含“/.vscode/”的python解释器。在这种情况下,在Windows中,我没有像 Linux 中那样提示输入用户密码。
  3. 在 C++ 文件中设置断点
  4. python 调试器当前停止在断点处。从调试器“(gdb) Attach”切换回另一个调试器“Python: Current File”,然后按 F5(继续)。

在最后一步中,vscode 应该自动在 python 和 c++ 代码之间的两个调试器之间跳转,但我无法实现此行为。

我可以单独调试 Python 和 C 程序,但不能一起调试。


在 Windows 上调试 Python C++ 代码时,您应该在 launch.json 文件中使用配置“(Windows) Attach”。为了简化将 C++ 调试器附加到 python 调试器的过程,您可以使用 VScode 扩展“Python C++ 调试”。

Nidiah 和 Bark 的两个示例都基于 Linux。

在 Windows 上,您可以将 C/C++ 代码编译为 .dll 文件(带有调试信息)并使用 python 中的 ctypes 加载它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 上的 VSCode 中调试 Python C/C++ 扩展 的相关文章

随机推荐

  • 用于验证 URL 的 PHP 正则表达式

    我正在寻找一个合适的正则表达式来匹配 URL 带有方案 域 路径等的完整 URL 我通常会使用 filter var 但在这种情况下我不能 因为我必须支持 PHP 我在网上搜索过 但找不到任何我相信万无一失的东西 而我能找到的只是人们说使用
  • 使用 CBC 模式使用 PyCrypto 进行 AES 256 加密 - 有什么弱点吗?

    我有以下 python 脚本来使用 AES 256 加密 解密数据 您能告诉我代码中是否有任何内容可能会使加密变弱 或者是否有任何我没有考虑到使用 CBC 的 AES 256 加密模式 我已经测试了该脚本 它工作正常 它正在加密和解密数据
  • 无法加载类“org.gradle.internal.logging.LoggingManagerInternal”。导致此意外错误的可能原因

    我想在 Bintray 上发布我的库 我试过here http code tutsplus com tutorials creating and publishing an android library cms 24582步骤但 grad
  • 如何判断一个变量是类还是对象

    我正在较低的水平上编写一个小框架 用于用 Python 为我的项目创建测试装置 在这里 我想知道某个特定变量是某个类的实例还是类本身 如果它是一个类 我想知道它是否是我的框架定义的某个类的子类 我该怎么做 class MyBase obje
  • 在 PowerShell 中使用 PrintDocument 时出现问题

    我正在尝试使用以下命令将 PowerShell 中的 PDF 文件打印到另一个 PDF 以删除某些属性 较早的线程 https stackoverflow com questions 52785842 print a pdf to a fi
  • 如何将 .XML 代码样式导入 IntelliJ Idea 15

    我想在编辑器中使用 XML 文件中定义的特定代码样式 如下所示
  • 如何使 C# 命名空间像 Java 包一样工作,以便在移动它们时自动重命名?

    我来自Java 发现Java中的包非常方便 当您将一个类移动到另一个包时 它会自动更改该包 当然 可以通过 Eclipse 或 Netbean 等 IDE 但 C 使用命名空间 并且不会像 Java 那样自动重命名我的命名空间 例如我有一个
  • 纯C 中的Cocoa OpenGL 窗口?

    我想在 MacOSX 中打开一个 OpenGL 窗口 以显示和抓取击键 鼠标事件 我不想使用 Glut 因为它要求它是根线程 我不想学习 Objective C 有没有办法用纯C语言访问OpenGL api Thanks 如果您想在 OS
  • 如何查看我的 GitHub 拉取请求已被接受的数量?

    有没有办法查明 GitHub PR 的接受率 可能使用 API 与此同时 了解所有存储库中我报告的问题有多少已经关闭以及仍然开放 这将是很有趣的 您还可以使用GraphQL API v4 https developer github com
  • 无法更新生产服务器上的 gem

    无法更新生产服务器上的 gem 我试过了bundle install deployment and bundle install without development test 但继续得到 You are trying to instal
  • 如果使用 CGPointEqualToPoint 不起作用

    我试图找出为什么当球位置与块位置完全相同并且锚点相同时该函数不执行 GameEnd 函数 if CGPointEqualToPoint ball position block position if CGPointEqualToPoint
  • 如何在socket.io中删除房间

    我想静态地从房间中删除所有用户 从而有效地删除该房间 这个想法是 将来可能会再次创建另一个同名的房间 但我希望它创建为空 没有前一个房间的听众 我对自己管理房间状态不感兴趣 而是很好奇 好像我可以利用 socket io 内部结构来做到这一
  • 在 iPhone 上创建弹出窗口?

    我想在 iPhone 上创建一个自定义样式的弹出框 我希望它有一个向上的箭头 关于如何实现这一目标有什么想法吗 尝试这个FP 弹出窗口 https github com 50pixels FPPopover它会对你有所帮助
  • 如何使用rails控制台进行调试并放入应用程序

    我想在通过 Rails 控制台打开的 irb 中打印一些行 我见过很多关于如何实现它的问题 但我在 irb 中什么也没得到 下面是代码 def show puts in show method post Feed find by id pa
  • 如何同时使用 CGAffineTransformMakeScale 和 Rotation?

    UIImageView dsry objectAtIndex 0 transform CGAffineTransformMakeRotation 1 57 2 UIImageView dsry objectAtIndex 0 transfo
  • 最喜欢的内容未在 webview 上正确显示

    我正在开发一个语言词典应用程序 我将最喜欢的单词保存到首选项中 XML 文件中的收藏夹内容如下所示
  • 伪代码的标准? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要将一些 python 和 java 例程翻译成我的硕士论文的伪代码 但在想出语法 风格时遇到了困难 持续的 容易明白 不太详细 不太接近自
  • 嵌入随机命名的 MP3

    这是我的代码 我希望 mp3 的 src 考虑到存在许多随机命名的 mp3 文件 sound 目录 并在每次打开页面时随机选择一个 有什么线索给我吗 我的服务器启用了 PHP 但我想让它尽可能简单 这应该可以做到 files glob pa
  • Android 通知上的表情符号

    我正在尝试在通知栏上显示表情符号 这是我的字符串 ue057 getString R string notification sent hey 我已经尝试过使用 Softbank 以及每种可能的格式 U 1F601 xF0 x9F x98
  • 在 Windows 上的 VSCode 中调试 Python C/C++ 扩展

    问题总结 我正在为 Python 开发一个自 C 扩展 以提高特定代码段的性能 我想调试这个扩展 但到目前为止还没有成功 我关注了几个链接 例如这是纳迪亚的 https nadiah org 2020 03 01 example debug