隨着pdb
,您可以使用漂亮的組合break function
和until lineno
:
沒有參數,繼續執行,直到與多家 大於達到當前行。
使用行號,繼續執行,直到行號大於或等於 的行。在這兩種情況下,噹噹前幀返回時也停止。
在版本3.2中更改:允許提供明確的行號。
你可以實現你所需要的。
我修改你的榜樣位(所以你會看到,指令獲取雖然PDB報告執行爲「下一個指令」):
01: class A(object):
02:
03: def __init__(self):
04: self.X = []
05:
06: def f(self):
07: print('pre exec')
08: for i in range(10):
09: self.X.append(i)
10: print('post exec')
11:
12: a = A()
13: a.f()
14: print('Game is over')
15:
而且從python -m pdb test.py
運行結果是這樣的:
> d:\tmp\stack\test.py(1)<module>()
-> class A(object):
(Pdb) until 11
> d:\tmp\stack\test.py(12)<module>()
-> a = A()
:
開始調試和剛下課的聲明(這樣你就可以添加一個名爲斷點)後,運行它
現在,在功能開始打破:
(Pdb) break A.f
Breakpoint 1 at d:\tmp\stack\test.py:6
與執行就繼續下去,直到它命中斷點:
(Pdb) continue
> d:\tmp\stack\test.py(7)f()
-> print('pre exec')
趁「也將停止在當前幀返回」:
(Pdb) until 14
pre exec
post exec
--Return--
如您所見,前執行和後EXEC印,但在執行where
當你還在f()
:
(Pdb) w
c:\python32\lib\bdb.py(405)run()
-> exec(cmd, globals, locals)
<string>(1)<module>()
d:\tmp\stack\test.py(13)<module>()
-> a.f()
> d:\tmp\stack\test.py(10)f()->None
-> print('post exec')
> d:\tmp\stack\test.py(10)f()->None
-> print('post exec')
而且所有的環境變量都完好無損:
(Pdb) p self.X
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
與現實生活中的例子
現在:
01: class A(object):
02: def __init__(self):
03: self.X = []
04:
05: def f(self):
06: for i in range(10):
07: self.X.append(i)
08:
09: a = A()
10: a.f()
11: print('Game is over')
開始類似的時尚a年代以前:
> d:\tmp\stack\test.py(1)<module>()
-> class A(object):
(Pdb) until 8
> d:\tmp\stack\test.py(9)<module>()
-> a = A()
(Pdb) break A.f
Breakpoint 1 at d:\tmp\stack\test.py:5
(Pdb) cont
> d:\tmp\stack\test.py(6)f()
-> for i in range(10):
現在...斷點在f.A
實際上意味着在f.A
先聲明這是不幸for i in...
所以它會在它的每一次突破斷點。
如果你實際上沒有用循環開始你的真實代碼,你可以跳過這部分。
(Pdb) disable 1
Disabled breakpoint 1 at d:\tmp\stack\test.py:5
再次使用until <end of file>
:
(Pdb) until 10
--Return--
> d:\tmp\stack\test.py(6)f()->None
-> for i in range(10):
再次,所有的幀變量:
(Pdb) p i
9
(Pdb) w
c:\python32\lib\bdb.py(405)run()
-> exec(cmd, globals, locals)
<string>(1)<module>()
d:\tmp\stack\test.py(10)<module>()
-> a.f()
> d:\tmp\stack\test.py(6)f()->None
-> for i in range(10):
(Pdb)
悲哀的事情在這裏,我想嘗試這塊自動化:
這將你需要自動一切按文件(同樣,沒有必要disable 1
當你有至少一個環預語句),但commands
:
指定任何命令恢復執行(目前繼續,步驟,下一步,返回,跳轉,退出和它們的縮寫)終止命令列表(就像該命令緊接着結束)。這是因爲,無論何時恢復執行(即使是簡單的下一步或步驟),都可能遇到另一個斷點 - 它們可能有自己的命令列表,從而導致關於執行哪個列表的歧義。
因此until
只是似乎不起作用(至少對於Windows 3.2.5下的Windows),你必須手工完成這項工作。
這可能不是最好的答案,所以我只是將它作爲註釋發佈,但是有一種快速和骯髒的方法可以用任何語言與monkeypatching(Python,Ruby,ObjC,Smalltalk等)工作:可以動態地將'Af'包裝在一個只返回real_A_dot_f(* args,** kw)的函數中,然後將該斷點放在該行上。我用過gdb/lldb/pdb/etc。腳本在過去爲我打包。 – abarnert
@abarnert我認爲你的評論更適合作爲完整答案。可能有更好的解決方案(我不知道),但如果你的建議有效,它仍然是一個解決方案。 –
我不確定,因爲我認爲它不符合「A.f」框架的當地人仍然活着要檢查的目的,但是我仍然寫了它;如果它對OP沒有用處,他總是可以忽略它,或者甚至會使它失望。 :) – abarnert