1、概述
GDB 可以用来调试 Python 代码,尤其是在调试底层 C 扩展(如 Cython 或 C++ 代码)时非常有用。虽然 Python本身有自己的调试工具(如 pdb),但 GDB 主要用于调试编译后的 C/C++ 代码,因此它在以下场景中特别有效:
1、调试 Python C 扩展或与 C/C++ 库交互的 Python 代码。
2、调试由于底层库(如 NumPy、PyTorch 等)导致的崩溃或异常。
3、调试 Python 和 C/C++ 代码之间的交互(例如,Cython 编译的代码、Python 扩展模块)。
2、如何使用 GDB 调试 Python 代码
安装 GDB
在 Linux 上,可以通过以下命令安装:
sudo apt-get install gdb
启动 GDB 调试 Python 解释器:
代码:
gdb --args python <your_script.py>
这将启动 GDB,并允许你指定 Python 代码脚本作为参数。
设置调试断点
你可以在 Python 脚本中设置断点来进行调试。例如,如果你想在 Python 的主模块或某个函数中设置断点,可以通过 break 命令设置断点:
(gdb) break PyEval_EvalFrameEx
这将在 Python 解释器执行每一帧时触发断点。
运行 Python 脚本
运行 Python 脚本,直到遇到设置的断点:
(gdb) run
调试 C 扩展代码
当 Python 代码调用底层 C 扩展(例如,numpy 或 torch 等)时,GDB 可以帮助你跟踪到 C 扩展的代码。如果 Python 崩溃或抛出错误,你可以使用 GDB 跟踪并分析调用栈,找出问题发生的底层 C/C++ 代码。
查看栈帧
当程序在 GDB 中停止时,你可以查看栈帧:
(gdb) bt
这将显示调用栈,帮助你查看 Python 调用的 C 函数调用。
设置断点在特定 C 函数上
如果你知道 C/C++ 扩展中的某个函数名,可以设置断点来调试这个函数:
(gdb) break <function_name>
通过 GDB 调试 Python 崩溃
当 Python 程序崩溃时,GDB 可以帮助你查看错误发生的位置。通常,当 Python 崩溃时,你可以在 GDB 中运行 backtrace 命令来查看调用栈并找出崩溃的原因。
示例:调试 Python C 扩展(例如,PyTorch)
假设你在使用 PyTorch,并且遇到崩溃,你可以启动 GDB 调试 PyTorch 底层代码:
gdb --args python -c "import torch; torch.randn(2, 2)"
然后,在 GDB 中设置断点并开始调试:
(gdb) break _ZN2at6TensorC1Ev
(gdb) run
一旦 PyTorch 代码执行到断点,GDB 会停下来,你可以查看栈帧、变量等,进行进一步的调试。
3、总结:
GDB 主要用于调试 C/C++ 代码,但也可以调试 Python 代码,特别是在与 C 扩展交互时。
通过 GDB 调试 Python 代码时,你可以设置断点、查看栈帧、分析崩溃,并跟踪底层的 C/C++ 代码。
如果你的 Python 代码涉及到 C 扩展或依赖底层库,使用 GDB 进行调试可以提供更深入的错误定位。