Python扩展调试

标签 python gdb debug-symbols python-extensions

我正在尝试调试我用 C 语言编写的 python 扩展模块。我使用以下代码编译了它:

python setup.py build -g install --user

然后我调试:

gdb python
...
b py_node_make
run test.py

它在 py_node_make(我定义的函数之一)处中断,但随后我尝试:

(gdb) print node
No symbol "node" in current context.

我要调试的函数是:

static Python_node_t* py_node_make(
        node_t* node)
{
    Python_node_t* pyNode;

    pyNode = PyObject_New(Python_node_t, &t_node);
    pyNode->node = node;
    pyNode->borrowed = true;

    return pyNode;
}

最佳答案

要使源代码调试工作,您的 C 扩展必须使用调试信息 (gcc -g) 构建。由于您正在使用 distutils 驱动编译过程,因此您可以指定通过 CFLAGS 环境变量 ( Installing Python Modules: Tweaking compiler/linker flags ) 使用的编译器标志:

CFLAGS='-Wall -O0 -g' python setup.py build

请注意,即使 distutils 默认的优化级别高于 -O0,您真的不应该得到 No symbol "node"in current context 错误,只要因为 -g 已通过,大多数 Python 构建默认会通过 -g

关于Python扩展调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253586/

相关文章:

python 使用列表从另一个字符串中删除一个字符串?

gdb - Peter 的 GDB 教程

fortran - 我声明了一个字符变量,但被告知我选择的符号不能有类型,我尝试过其他符号,但得到相同的错误

linux - 我在目标系统中生成了带有调试符号的 linux 核心转储。但是我无法在主机系统中使用 GDB 调试转储

debugging - 为什么 SASM 的调试器在存储后不显示 "result"变量更新的值?

python - 如何使用 PyTorch 多处理?

Python:如何获取我所在函数的*完整*名称

python - 游戏图形数组的快速操作

python - 如何在 Windows 上调试 Python 的 C 扩展

c - GDB 在进入断点时抛出错误