Python如何實現單步調試


方法一:執行 python -m pdb myscript.py

(Pdb) 會自己主動停在第一行。等待調試,這時你能夠看看 幫助

方法二:在所調試程序的開頭中:import pdb 並在你的代碼行設置斷點:pdb.set_trace()
 

(Pdb) h
說明下這幾個關鍵 命令

<斷點設置 
(Pdb)b 10 #斷點設置在本py的第10行
或(Pdb)b ots.py:20 #斷點設置到 ots.py第20行
刪除斷點(Pdb)b #查看斷點編號
(Pdb)cl 2 #刪除第2個斷點

<執行
(Pdb)n #單步執行
(Pdb)s #細點執行 也就是會下到,方法
(Pdb)c #跳到下個斷點
<查看
(Pdb)p param #查看當前 變量值
(Pdb)l #查看執行到某處代碼
(Pdb)a #查看所有棧內變量

<假設是在 命令行里的調試為:
import pdb
def tt():
pdb.set_trace()
for i in range(1, 5):
print i

<<< tt()
#這里支持 n p c 而已
< (3)tt()
(Pdb) n

 

單步調試 

 

pdb單步調試方法總結如下:

命令

 

解釋

break 或 b 設置斷點

設置斷點

continue 或 c

繼續執行程序

list 或 l

查看當前行的代碼段

step 或 s

進入函數

return 或 r

執行代碼直到從當前函數返回

exit 或 q

中止並退出

next 或 n

執行下一行

pp

打印變量的值

a

查看全部棧內變量

 

 遇到大型python項目,如何定位問題和監控程序的運行狀態是一個程序員必須掌握的技能,今天小編為你帶來python程序的單步調試方法,方便易用,簡單易記!

首先你需要在所調試程序的開頭中:import pdb 並在你的代碼行設置斷點:pdb.set_trace()

 

 

程序開始之后pdb調試界面:

> c:\users\wangchao\workspace\interface_test\testframe.py(253)HTTPInvoke() -> if reqmethod.upper()=="GET": (Pdb) l                               #執行命令l,會顯示出當前代碼的上下文,下面的‘->’就是當前即將執行的代碼
248      def HTTPInvoke(url,requestUri):
249          proto,rest=urllib.splittype(url)
250          host,rest =urllib.splithost(rest)
251          conn = httplib.HTTPConnection(host)  
252          pdb.set_trace()
253  ->        if reqmethod.upper()=="GET":
254              print url
255              conn.request(reqmethod.upper(), url,headers=reqHeaders)
256              rsps = conn.getresponse()
257              if rsps.status==200:
258                  data = rsps.read()
(Pdb) reqmethod.upper() #可以直接輸入相關變量名稱來查看當前變量的值
'GET'
(Pdb) n #n就是next的意思就是執行下一行
> c:\users\wangchao\workspace\interface_test\testframe.py(254)HTTPInvoke()
-> print url
(Pdb) b 260 #設置斷點
Breakpoint 1 at c:\users\wangchao\workspace\interface_test\testframe.py:260
(Pdb) n
> c:\users\wangchao\workspace\interface_test\testframe.py(254)HTTPInvoke()
-> print url
(Pdb)
http://yue.sogou.com/api/h5/v1/history/recharge/list?pageNo=1&pageSize=1
> c:\users\wangchao\workspace\interface_test\testframe.py(255)HTTPInvoke()
-> conn.request(reqmethod.upper(), url,headers=reqHeaders)
(Pdb) s # 上面通過執行n程序運行到調用函數的地方,使用s可以進入函數內部
--Call--
> c:\python27\lib\httplib.py(1040)request()
-> def request(self, method, url, body=None, headers={}):
(Pdb) a # 顯示當前所有棧變量的值
self = <httplib.HTTPConnection instance at 0x03A8CE68>
method = GET
url = http://yue.sogou.com/api/h5/v1/history/recharge/list?pageNo=1&pageSize=1
body = None
headers = {'Connection': 'keep-alive', 'Cookie': 'SUV=004C0C0F6FCA67CB585CD8F53FC5D135; CXID=647977743F187E018526B8ECA587A052; IPLOC=CN1100; OPENID=6D4569C5D00A35876E60A94E34D685AD; pgv_pvi=2641157120; _ga=GA1.2.2141014782.1484890447; ssuid=5496173722; SMYUV=1485154923097202; sgsa_id=sogou.com|1486180882291442; GOTO=Af99046; clientId=291C8B8E05B2647F206981AD04136539; JSESSIONID=aaa_iPLt7BVjahJ1G5GOv; SNUID=FB57E5402F2A672762F7CB303085C13A; ld=uRGSyZllll2YYa4WlllllVAtUeYlllllWTieMkllll9llllljylll5@@@@@@@@@@; LSTMV=316%2C266; LCLKINT=3486; sct=61; ad=jkllllllll2Yg2o@lllllVANab9lllllbDIXhZllllwllllljOxlw@@@@@@@@@@@; SUID=7BC6CA017F430E0A0000000052256039; YYID=AA6E39EBC7D6CC4AA0839B4929E7511C; usid=pp63hL5QOQSxi2gw; sgid=AViadNOrPzjYb8SzAw5wsq5g', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0'}
(Pdb) l
1035                 self.__state = _CS_REQ_SENT
1036             else:
1037                 raise CannotSendHeader()
1038             self._send_output(message_body)
1039     
1040 ->        def request(self, method, url, body=None, headers={}):
1041             """Send a complete request to the server."""
1042             self._send_request(method, url, body, headers)
1043     
1044         def _set_content_length(self, body, method):
1045             # Set the content-length based on the body. If the body is "empty", we
(Pdb) r #命令r返回到前面所進入函數的末尾
--Return--
> c:\python27\lib\httplib.py(1042)request()->None
-> self._send_request(method, url, body, headers)
(Pdb) l # 可以通過l驗證一下當前程序執行的位置
1037                 raise CannotSendHeader()
1038             self._send_output(message_body)
1039     
1040         def request(self, method, url, body=None, headers={}):
1041             """Send a complete request to the server."""
1042 ->            self._send_request(method, url, body, headers)
1043     
1044         def _set_content_length(self, body, method):
1045             # Set the content-length based on the body. If the body is "empty", we
1046             # set Content-Length: 0 for methods that expect a body (RFC 7230,
1047             # Section 3.3.2). If the body is set for other methods, we set the
(Pdb) r # 再執行r返回到調用該函數的地方
> c:\users\wangchao\workspace\interface_test\testframe.py(256)HTTPInvoke()
-> rsps = conn.getresponse()
(Pdb) l
251          conn = httplib.HTTPConnection(host)  
252          pdb.set_trace()
253          if reqmethod.upper()=="GET":
254              print url
255              conn.request(reqmethod.upper(), url,headers=reqHeaders)
256  ->            rsps = conn.getresponse()
257              if rsps.status==200:
258                  data = rsps.read()
259                  data = str(data)  
260 B                conn.close()  
261                  return data
(Pdb) c #執行命令c繼續運行程序,直到斷點就停留在此位置,上面設置斷點的命令“b 260”260表示第多少行
> c:\users\wangchao\workspace\interface_test\testframe.py(260)HTTPInvoke()
-> conn.close()
(Pdb) l
255              conn.request(reqmethod.upper(), url,headers=reqHeaders)
256              rsps = conn.getresponse()
257              if rsps.status==200:
258                  data = rsps.read()
259                  data = str(data)  
260 B->                conn.close()  
261                  return data
262              elif rsps.status==301 or rsps.status==302:
263                  headerstr=rsps.getheaders()
264                  for i in headerstr:
265                      if i[0].lower()=='location':
(Pdb) pp data # pp 打印某個變量的值
'{"code":0,"data":{"pageCount":0,"pageList":[],"pageNo":1,"pageSize":1,"totalCount":0},"msg":"\xe6\x88\x90\xe5\x8a\x9f"}'
(Pdb)

總結:上面的程序是本人私有,因而不能全部上傳,在練習pdb時,建議使用自己的程序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM