繁体   English   中英

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

[英]Get a Global Variable while a Python Program is running

我在CentOS 5.5上编写了Python 2.5命令行程序,该程序已经运行了1天,并且仍在运行。 现在,我想结束该程序,但要获取全局变量的值。

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

假设全局变量是一个List,其名称是resultlist 我如何获得其价值?

可以做到的,但是非常棘手,一个错误的动作将导致程序崩溃(或以不确定状态丢失)。

您可以使用C函数PyEval_GetGlobals()返回全局字典(就像您在python中调用globals() ),然后使用PyObject_Print()将对象打印到文件中(最简单的方法是连接stdout )至)。

您将要运行GDB并将其附加到python实例。 然后在您将要调用的函数上设置一个断点(如果您的程序正在打印输出,则PyObject_Print()将起作用;否则此页面上的某些函数可能会被调用很多。),然后当程序到达断点时,您将要禁用它,并打印全局变量。

例如,如果我的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.

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

恐怕名字对您没有多大帮助。 由于您没有建立某种打印机制,并且您的流程已经在运行,因此您几乎不知所措。

如果您有什么想法,最好是使用过程内存扫描仪,然后开始搞乱。 尽管我估计您的成功机会非常低,但很抱歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM