gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:43:57 26 4
gpt4 key购买 nike

问题总结
我正在为 Python 开发自 C 扩展,以提高特定代码段的性能。我想调试这个扩展,但到目前为止我还没有成功。我已经关注了几个链接,例如 this from Nadiahthis from Bark ,但我总是有同样的问题:我不能在 C 代码的任何断点处停止。
我尝试过的方法
这个想法是将 Python 作为主进程运行,并将编译后的 C 代码附加到这个主进程。关注我留下minimal reproducible example :
python 文件

import os
import greet

pid = os.getpid()

test=2.2

greet.greet('World')

print("hi")
如您所见,我什至在附加C代码时检索进程ID,以便在vscode中选择此ID,如下所示:
代码
#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);
}
我通过运行 python setup.py install 使用 GCC 8.1 编译 C 代码:
安装文件
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"
}
]
我遵循的调试步骤
  • 在python文件中添加断点,运行启动配置“Python:当前文件”,等待到断点。
  • 运行“(gdb)Attach”启动配置,选择路径包含“/.vscode/”的python解释器。在这种情况下,在 Windows ,我没有像在 Linux 中那样被提示输入我的用户密码。
  • 在 C++ 文件中设置断点
  • 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 加载它。

    关于python - 在 Windows 上的 VSCode 中调试 Python C/C++ 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66077410/

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