我在CentOS 5.5上写了一个Python2.5命令行程序,它已经运行了1天,而且还在运行。现在我想结束这个程序,但是要得到一个全局变量的值。
我在谷歌上做了一些事情。获取全局变量的值的唯一方法似乎是将Python程序附加到GDB。
假设全局变量是一个列表,它的名称是resultlist。如何获取它的值?
发布于 2011-03-15 11:35:21
这是可以做到的,但非常棘手,一个错误的移动将导致程序崩溃(或在不确定的状态下丢失)。
您可以使用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.然后,在程序的输出中,您将看到全局字典。
发布于 2011-03-15 10:57:22
恐怕名字对你没多大帮助。因为您没有内置一些打印机制,而您的进程已经在运行,所以您很可能就搞砸了。
如果您知道这些值可能是什么,那么最好的办法就是使用进程内存扫描程序,然后开始胡乱操作。尽管我估计你成功的机会很小,但我很抱歉。
https://stackoverflow.com/questions/5306959
复制相似问题