在Python程序运行时获取全局变量

时间:2011-03-15 02:43:20

标签: python debugging command-line gdb

我在CentOS 5.5上编写了一个Python 2.5命令行程序,它已经运行了1天并且仍在运行。现在我想结束这个程序,但得到一个全局变量的值。

我做了一些谷歌。获取全局变量值的唯一方法是将Python程序附加到GDB

假设全局变量是List,其名称为resultlist。我怎样才能获得它的价值?

2 个答案:

答案 0 :(得分:6)

可能会这样做,但是非常棘手,一次错误的移动会导致程序崩溃(或者在不确定的状态下丢失)。

您可以使用C函数PyEval_GetGlobals()返回全局变量字典(就像在python中调用globals()一样),然后使用PyObject_Print()将该对象打印到文件(最简单的是stdout所连接的任何内容)。

您需要运行GDB并将其附加到python实例。然后在你知道将要调用的函数上设置一个断点(如果你的程序正在打印输出,那么PyObject_Print()将起作用;否则this page有一些可能被调用很多的函数。),然后当程序命中断点,你想要禁用它,并打印全局变量。

例如,如果我的Python程序的PID为15847:

(gdb) attach 15847
Attaching to process 15847.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ............. done
0x00007fff870b5e52 in select$DARWIN_EXTSN ()
(gdb) break PyObject_Print
Breakpoint 1 at 0x10003d8f4
(gdb) c
Continuing.

下次你的节目打印时:

Breakpoint 1, 0x000000010003d8f4 in PyObject_Print ()
(gdb) disable
(gdb) call (int)PyObject_Print((void*)PyEval_GetGlobals())
$1 = 0
(gdb) c
Continuing.

然后,在程序的输出中,您将看到全局字典。

答案 1 :(得分:1)

我担心名字对你没有多大帮助。由于你没有构建一些打印机制并且你的进程已经运行,所以你几乎搞砸了。

如果您知道值可能是什么,那么您最好的选择就是使用进程内存扫描程序并开始搞乱。虽然我估计你的成功几率非常低,但我很抱歉。