2013-01-12 22 views
4

我知道我可以使用PDB跟蹤一個模塊,並且我可以通過預先使用!命令從pdb執行任意命令! (例如!"foo".upper())。跟蹤在PDB中發佈的任意Python命令?

是否有某種方法可以將這些功能組合起來,以便通過在當前上下文中執行的任意命令進行跟蹤?例如。像step !"foo".upper()"這樣會讓我通過upper方法,然後返回到早期上下文?

+0

不是真的,你只能通過framestack –

回答

3

使用pdb.runcall

(Pdb) pdb.runcall(func, *args, **kwds) # e.g. pdb.runcall(myfunc, arg1, arg2) 

,並通過它一步(N或S)或設置斷點到它

(Pdb) b my_module.py:123 # b ([file:]lineno | function) [, condition] 

,並通過按 「C」 運行到斷點。

您不能跟蹤您在示例中使用的str.upper等內建函數。

編輯:你還問了當前上下文
您可以評估和調試,在目前情況下,用戶定義的函數的表達式。例如:

pdb.runeval("[myfunc(x) for x in range(3)]", globals(), locals()) 
# or with ... some_module.globals()) 

參數若無當地人()中使用globals(), locals()是重要的,因爲沒有他們的表達將在__main__模塊上下文在當前模塊上下文中計算,或者直接,但不是在當前全局和局部上下文,因爲它通常與!expression