1

我有一个已经运行了好几天的脚本,大约完成了一半。它有一个愚蠢的错误,如果某个计数器变得太高,它将导致它在完成之前崩溃(否则计数器未被使用;我不介意修改它以保持脚本运行)。我没有先见之明去导入一个模块或者写一个后门让我以任何方式改变状态;有人告诉我,我仍然可以使用 gdb 到达柜台。

为简单起见,想象一下我在下面谈论这个脚本,我从命令行运行它作为“python foo.py”

from time import sleep
i = 0
while(True):
    i += 1
    if (i > 100):
        raise Exception("Explosion")
    sleep(10)

我究竟需要不时输入 gdb 以将变量 i 的值更改为 0 并避免爆炸?(如果重要的话,我的 python 二进制文件是 2.7.3)。

4

1 回答 1

1

继续前进并自己通电。这对我有用(未显示 - 'file' 加载 python 二进制文件,'attach'; 'detach' 从进程):

  1. "bt" - 查看堆栈跟踪
  2. “frame foo” - 其中 foo 是第一个提到“globals”作为 Py* 函数参数的帧
  3. “打印全局变量”(或者,打印*(PyDictObject*)globals)- 确认您的变量在那里
  4. “向下” - 移动到您感兴趣的框架下方。
  5. “完成” - (可能没有必要?) - 让 python 完成它正在做的任何事情并释放任何可能干扰与全局对象接口的锁等。
  6. “调用 PyDict_SetItemString(globals, "i", PyLong_FromLong(0))" - 希望它不会出现段错误。将“i”更改为您的变量。
  7. “继续” - 如果幸运的话,计数器现在应该已重置为 0。

但是,为了成功,我认为必须在开始运行 python 进程之前安装/设置 python2.7-gdb - 事后不能这样做,或者 gdb 看到乱码堆栈。

于 2013-09-06T01:17:06.507 回答