2016-01-13 62 views
4

在PDB(或IPDB),我們可以執行語句和計算表達式與! or p commands如何在pdb中調試手動輸入的表達式和語句?

p表達
       評估在當前上下文中的表達並打印它的值。

[!]語句

       在當前堆棧幀的上下文中執行的(單行)語句。除非語句的第一個單詞類似於調試器命令,否則感嘆號可以省略。要設置一個全局變量,你可以在同一行與全局命令前綴分配命令

因此,例如,我可以輸入p reddit.get_subreddits()而在IPDB調試和代碼將在目前情況下執行,我會看到返回值。

有沒有一種方法可以調試這種「手動輸入」表達式的執行?

基本上我想要做的是s reddit.get_subreddits(),但只是執行step命令並忽略表達式。

編輯:一個簡單的例子

就拿這個簡單的功能:

import random 

def get_value_for_weekday(weekday_index=None): 
    values = [10, 20, 20, 10, 30, 30, 30] 
    if not weekday_index: 
     # If no weekday provided, return the average of all weekdays 
     return sum(values)/7 
    return averages[weekday_index] 

if __name__ == '__main__': 
    while True: 
     import ipdb; ipdb.set_trace() # enter ipbd for debug 
     get_value_for_weekday(random.randint(0, 7)) 

這是因爲if not weekday_index(則應檢查weekday_index is not None

竊聽假設我注意到我獲得10是我期待的次數的一半。所以我在調用函數之前添加了一個import ipdb; ipdb.set_trace()來嘗試和調試代碼。

所以我在ipdb控制檯,我突然意識到,也許問題是當我傳遞0作爲weekday_index。 我可以IPDB直接測試我的假設:

ipdb> p get_value_for_weekday(0) 
22 

好了,我意識到有些不對勁時weekday_index=0
我現在想要做的是逐步調用get_value_for_weekday(0)的調用,以便我可以看到我錯誤地進入了if塊。

很明顯,我可以退出ipdb,停止腳本,更改代碼始終傳遞0,重新啓動腳本,當我輸入ipdb時,使用ipdb steps)命令調試調用。
但是,如果我可以做s get_value_for_weekday(0),那麼我能做到​​的方式就不會更容易嗎?

有沒有辦法做這樣的事情?

+1

你能給我一個更具體的考試,我可以重現嗎?我有點難以理解你在找什麼。 –

+0

增加了一個例子,我希望它使事情更清晰。 – LeartS

回答

1

關於您的示例, 您不需要退出pdb並更改代碼。 你可以進入函數(用's')並設置weekday_index = 0。

一個解決方案是原來的問題如下使用調試器的跳轉命令:

  1. 跳用「J#行號」
  2. 一步的功能與「S」在函數調用前
  3. 設置輸入參數,並繼續調試。

這個工作時,我試過了,但調試器抱怨,當我試圖做第3步之前出於某種原因的第2步。

+0

我不一定要調試一個函數調用,稍後我會進入它,也許是另一個函數調用(我不會介入,但可能有副作用或幫助我以某種方式理解代碼)。我想我的例子並不好。 – LeartS

+1

我明白了。我不確定ipdb是否可行。 –

+1

問題的一個不同的解決方案是使用調試器的跳轉命令,如下所示:(1)在使用's'的函數中使用'j#行號'(2)步驟調用函數之前跳轉(3)將輸入params並繼續調試。 –

4

我想你正在尋找(d)ebug命令,出於某種原因,在Debugger Commands中沒有指定。僅供將來參考,pdb有一組很好的命令(您可以通過在交互式提示中輸入help來查看)。在debug命令:

(Pdb) help debug 
debug code 
     Enter a recursive debugger that steps through the code 
     argument (which is an arbitrary expression or statement to be 
     executed in the current environment). 

這似乎是你在做什麼之後。從終端使用的示例腳本:

python -m pdb pdbscript.py 

爲了發出兩個n命令來獲得解析的功能後(我相信這是怎麼pdb作品)。您可以發出命令debug get_value_for_weekday(0)在函數遞歸步驟:

(Pdb) debug get_value_for_weekday(0) 
ENTERING RECURSIVE DEBUGGER 
> <string>(1)<module>() 
((Pdb)) s 
--Call-- 
> /home/jim/Desktop/pdbscript.py(3)get_value_for_weekday() 
-> def get_value_for_weekday(weekday_index=None): 
((Pdb)) n 
> /home/jim/Desktop/pdbscript.py(4)get_value_for_weekday() 
-> values = [10, 20, 20, 10, 30, 30, 30] 
((Pdb)) n 
> /home/jim/Desktop/pdbscript.py(5)get_value_for_weekday() 
-> if not weekday_index: 
((Pdb)) p weekday_index 
0 
((Pdb)) n 
> /home/jim/Desktop/pdbscript.py(7)get_value_for_weekday() 
-> return sum(values)/7 

待辦事項,感覺真的很粗略這個表格元的調試的,但它似乎是你追求的。

+1

這似乎正是我正在尋找! – LeartS

+0

@LeartS我很高興!就像我注意到的,我對嵌入式調試器感到很奇怪。想想他們會讓我頭痛一點。 –