2011-03-15 24 views
1

我在CentOS 5.5上編寫了一個Python 2.5命令行程序,它已運行1天並仍在運行。現在我想結束這個程序,但是得到一個全局變量的值。正在運行Python程序時獲取全局變量

我已經做了一些Google。似乎獲得全局變量值的唯一方法是將Python程序附加到GDB

假設全局變量是一個List,它的名字是resultlist。我怎樣才能得到它的價值?

回答

1

恐怕名字幫不了你。既然你沒有構建一些打印機制,並且你的進程已經在運行,那麼你已經非常麻煩了。

如果你有一個想法什麼值可能是你最好的選擇將使用一個進程內存掃描器,並開始搞亂。雖然我估計你的成功機率很低,但我很抱歉。

6

這個可以做的,但是非常棘手,而且一個錯誤的移動會導致程序崩潰(或者在不確定的狀態下丟失)。

可以使用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. 

然後,在你的程序的輸出,你會看到全局字典。