[python] 如何debug python脚本中C++后端的core dump

文章目录

Debug过程

  • 另外:对于core dump: gdb版本是>=7,gdb从版本7开始支持对Python的debug。
  • 确保你的系统中安装了 GDB 调试器和对应版本的 Python 调试信息包(例如 python-dbg 或 python-debuginfo)。
# 第一步先gdb跑执行python脚本时使用的python bin
gdb path/to/python
# 进入debug 对话框口, 
run python_script.py arg1 arg2 

# 或
gdb -ex r --args python <programname>.py <arguments>

# 打断点
break your_script.py:10  或者 break function_name

############ debug core信息
gdb path/to/python  path/to/core_file
#进入对话框后 执行bt
py-bt

# 如果进程已经开始运行,你可以通过 PID 来接入它:
gdb python <pid of running process>
  • 如果python中有执行C++后端,则在编译python应用的时候,需要在build的时候带上debug信息,这样debug时,更能发现问题细节; 如果用bazel工具编译的,则:
# package中是编译C++后端并生成可用python调用的前端代码,使用pybind11来封装C++供python使用的
bazel build  --strip=never --copt=-g --copt=-ggdb  //path/to/package/... 
# 然后执行上面的命令,开始debug python和它的后端C++

扩展阅读:

Reference

  • https://blog.youkuaiyun.com/keidoekd2345/article/details/45037751
### 如何使用 GDB 和 Python 调试 C++ 程序 当涉及到跨语言编程时,尤其是 Python 调用 C++ 的共享库 (`.so` 文件),可能会遇到一些难以定位的错误。在这种情况下,GDB 是一种非常强大的工具,可以帮助开发者深入分析问题。 #### 1. 基本概念 GDB 支持多语言调试环境,在这种场景下可以通过设置断点、观察变量以及跟踪调用堆栈等方式来诊断问题。对于 Python 调用 C++ 库的情况,可以利用 `gdb` 来捕获并分析 C++ 部分的行为,同时通过特定命令查看 Python 层面的信息。 --- #### 2. 启动 GDB 并加载目标程序 为了启动调试会话,需要先运行带有 `-ex run` 参数的 GDB,并指定要调试的目标可执行文件或脚本。如果目标是一个由 Python 执行的 C++ 动态链接库,则可以直接附加到正在运行的进程或者直接在 GDB 中启动 Python 解释器[^1]: ```bash gdb python ``` 接着可以在 GDB 提示符下输入以下指令以加载扩展支持用于更好地处理 Python 数据结构: ```gdb source /path/to/python-gdb.py ``` 此操作允许后续使用诸如 `py-bt` 这样的专用命令显示完整的 Python 调用链路[^2]。 --- #### 3. 设置断点与触发条件 一旦进入了 GDB 控制台之后,就可以像平常一样为 C++ 函数设定断点了。例如,假设有一个名为 `my_function()` 的函数存在于被调用的 `.so` 文件里,那么可以用下面的方式创建一个简单的断点: ```gdb break my_function ``` 另外还可以基于某些表达式的真伪决定是否暂停执行流程;这对于只关心特殊条件下发生的异常特别有用。比如仅当某个全局计数器达到一定数值才中断的话,可以这样写: ```gdb condition 1 counter >= threshold_value ``` 这里,“1”代表刚才定义的那个编号为一的常规断点位置[^4]。 --- #### 4. 查看混合调用栈信息 当到达预设好的停止点后,除了传统的 C/C++ 方法外,还能够借助之前提到过的增强功能获取更全面的画面视角。特别是通过发出 `bt full` 或者专门针对 PyObjects 的版本即 `py-bt` ,后者能揭示出当前上下文中涉及的所有 Python 对象及其相互关系网络图谱: ```gdb py-bt ``` 这一步骤有助于理解整个系统的运作机制,从而更容易找到潜在缺陷所在之处。 --- #### 5. 处理 Core Dump 文件 如果应用程序已经崩溃并且留下了核心转储(core dump)文件,则可以从该状态重新开始调查过程而无需重现原始失败情形。只需告诉 GDB 关联哪个镜像文件即可继续前进: ```bash gdb ./your_program core_file_name ``` 随后按照正常步骤审查现场状况直至发现问题根源为止[^3]。 --- #### 示例代码片段展示如何配置延迟以便于介入调试阶段 有时可能希望给定额外的时间窗口让开发人员有机会连接远程服务器上的实例进行实时监控活动。这时可在适当的地方加入短暂休眠语句实现这一目的: ```cpp #include <thread> #include <chrono> void wait_for_debugger() { std::this_thread::sleep_for(std::chrono::seconds(10)); } ``` 记得事后移除此类辅助措施以免影响最终产品性能表现! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值