core dumped (python) 问题分析和解决办法

core dumped 是什么?

核心转储,core是cpu,很好理解。dumped:垃圾场,丢弃,(转储是意译)。说明进程运行出错,就是把cpu无法继续运行该进程,机器脑中的垃圾不能一直保留,要丢掉。为了搞清楚为啥出错,这堆cpu丢掉的垃圾是分析的关键。比分析垃圾更关键的是,分析cpu在什么时候(代码片段)出的问题,完成core dumped 的代码定位,就可以下一步调试解决。

core dumped 如何定位?

网上往往给出的是解决的具体办法,而不是定位分析的通用方式。这里,我们采用gdb对python程序中 core dumped 问题进行定位。就是将python程序运行在gdp创造的监视环境下,能够清晰反馈出程序执行的过程。wiki.python.org给出了如何使用gdb对python程序进行调试的两种方法

  1. 启动python之前使用gdb,这种方法对conda环境的python依然有效果哦!
$ gdb python
...
(gdb) run <programname>.py <arguments>
  1. 启动python后使用gdb, 我这里感觉不是很好用,没有第一种好
$ gdb python <pid of running process>

我选择第一种方式成功在gdb的环境下让python运行起来了,程序出错(车祸),gdb立马封锁现场。用这种方式就可以定位到core dumped的位置了。

core dumped 如何解决?

在gdb的环境下,python程序顺利启动。core dumped 这个错误一般会重现。gdb就会在cpu的车祸现场拍下足够的照片,不急着将垃圾dump到垃圾场,等着伟大的程序员去现场勘探。位置分析重要的手段是 bt(backtrace)(列出调用栈)。然后就可以分析出错误的大致原因了,详情见下面的例子。

例子

在这里插入图片描述

  • 问题出在显卡驱动的调用上,线程号也给出来了,调用显卡驱动的是_glDeleteTextures()函数,这个texture给我很强的暗示;
  • 进一步backtrace,发现是mujoco中间释放Context导致的;
  • 结合我自己的代码,实际是使用robosuite的domain random的wrapper的时候才有问题,又不得不用这个wrapper,结合上述分析,我们将wrapper中texture的DR选项关闭,重新测试,代码又可以飞起来了。

总结:gdb代码调试神器,上古利器(1986年),高端程序员必备。 愿你我程序无bug。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值