我在CentOS 5.5
上编写了一个Python 2.5命令行程序,它已运行1天并仍在运行。现在我想结束这个程序,但是得到一个全局变量的值。正在运行Python程序时获取全局变量
我已经做了一些Google。似乎获得全局变量值的唯一方法是将Python程序附加到GDB
。
假设全局变量是一个List,它的名字是resultlist
。我怎样才能得到它的价值?
我在CentOS 5.5
上编写了一个Python 2.5命令行程序,它已运行1天并仍在运行。现在我想结束这个程序,但是得到一个全局变量的值。正在运行Python程序时获取全局变量
我已经做了一些Google。似乎获得全局变量值的唯一方法是将Python程序附加到GDB
。
假设全局变量是一个List,它的名字是resultlist
。我怎样才能得到它的价值?
恐怕名字帮不了你。既然你没有构建一些打印机制,并且你的进程已经在运行,那么你已经非常麻烦了。
如果你有一个想法什么值可能是你最好的选择将使用一个进程内存扫描器,并开始搞乱。虽然我估计你的成功几率很低,但我很抱歉。
这个是可以做的,但是非常棘手,而且一个错误的移动会导致程序崩溃(或者在不确定的状态下丢失)。
可以使用C函数PyEval_GetGlobals()
返回全局的字典(因为它会如果你叫蟒蛇globals()
),然后用PyObject_Print()
打印该对象到一个文件中(最简单的幸福无论stdout
连接) 。
你会想运行GDB并将它附加到python的实例。然后在一个你知道会调用的函数上设置一个断点(如果你的程序正在打印输出,那么PyObject_Print()
就可以工作;否则this page就会有一些函数可能会被调用很多),那么当程序碰到断点时,你会想要禁用它,并打印全局变量。
例如,如果我的Python程序有15847一个PID:下一次你的程序去打印东西
(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.
然后,在你的程序的输出,你会看到全局字典。