在 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++ 扩展 的相关文章

  • 如何在交互式绘图(Python)中获得鼠标指向的(x,y)位置?

    我使用 ipython 笔记本 带有魔法 matplotlib nbagg 我正在审查matplotlib widget Cursor但仅查看光标widgets Cursor http matplotlib org 1 4 3 exampl
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 检查多个 pd.DataFrame 是否相等

    是否有一种 Pythonic 方式 无循环或递归 来检查是否超过两个pd DataFrames 例如 pd DataFrames 列表 彼此相等吗 就像是 all x equals dfs 0 for x in dfs with dfs数据
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何测试列表中多个值的成员资格

    我想测试两个或多个值是否在列表中具有成员资格 但我得到了意外的结果 gt gt gt a b in b a foo bar a True 那么 Python 可以同时测试列表中多个值的成员资格吗 这个结果意味着什么 See also How
  • 如何在 Sublime 2 REPL Mac 中运行 Python 3

    我的问题如下 我安装了 sublime 2 和 sublime repl 插件 一切正常 我唯一需要的是更改在控制台内置的 sublimerepl 上运行的 python 版本 我的意思是 我有 python 2 7 5 预先安装了 mav
  • 在python中安装scipy模块时出错

    我正在尝试使用 pip 在 python 中安装 scipy 模块 它显示以下错误 Command c users sony appdata local programs python python35 32 python exe u c
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • Scrapy 抓取并跟踪 href 中的链接

    我对 scrapy 很陌生 我需要从 url 的主页跟踪 href 到多个深度 再次在 href 链接内我有多个 href 我需要遵循这些href 直到到达我想要抓取的页面 我的页面的示例 html 是 初始页 div class page
  • Flask 扩展未在 app.extensions 中注册

    我想访问在我的 Flask 应用程序上注册的一些扩展 我尝试使用app extensions 但我初始化的一些扩展不在字典中 from flask import current app current app extensions get
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 在多个图表上绘制一条线

    I don t know how this thing is called or even how to describe it so the title may be a little bit misleading The first a
  • 在至少 7 天内连续三天登录该产品的用户

    我有一个用于用户参与的数据框 df 如下所示 time stamp user id 2013 01 01 10 05 23 1 2013 01 03 16 35 23 1 2013 01 06 11 06 35 1 2013 01 10 1
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • django admin 中内联模型的分页器

    我有这个简单的 django 模型 由一个传感器和特定传感器的值组成 每个日射强度计的值数量很多 gt 30k 是否可以以某种方式分页PyranometerValues在特定日期或一般情况下将分页器应用于管理内联视图 class Pyran

随机推荐

  • 用于验证 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