首页 > 代码库 > Python学习之单步调试详解

Python学习之单步调试详解

遇到大型python项目,如何定位问题和监控程序的运行状态是一个程序员必须掌握的技能,本文和大家分享的是python程序的单步调试方法,一起来看看吧,希望对大家学习python有所帮助。

 

首先你需要在所调试程序的开头中:import pdb 并在你的代码行设置断点:pdb.set_trace()

 

def get_input(Data, SuiteID, CaseID, caseinfolist):  

    global sArge

    sArge=’’

    args = []  

    #对于get请求,将参数组合  

    if reqmethod.upper()==’GET’:

        for j in range(0, caseinfolist[1]):  

            if Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j) != "None":

                ArgValue = http://www.mamicode.com/ Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j)

                if ’$$’ in ArgValue:#走关联分支

                    args = ArgValue.split(’$$’)

                    #print args

                    corvalue = http://www.mamicode.com/Correl(args[0], args[1], args[2])

                    pdb.set_trace()   #######这儿设置断点,程序运行到此处就开始了单步调试###########

                    if corvalue =http://www.mamicode.com/= []:

                        sArge = ’correlerr’

                        #return sArge

                        #infolog="关联失败"

                        #ret1 = ’NG’

                        #Data.write_data(SuiteID, Data.casebegin+CaseID, 15,infolog,NG_COLOR)

                        #write_result(Date, SuiteID, Data.casebegin+CaseID, 16, ret1)

                    else:

                        sArge=sArge+caseinfolist[2][j]+’=’+corvalue[0]+’&’                        

                else:

                    sArge=sArge+caseinfolist[2][j]+’=’+ArgValue+’&’

                #print sArge

        #去掉结尾的&字符  

        if sArge[-1:]==’&’:  

            sArge = sArge[0:-1]     

        #sInput=caseinfolist[0]+sArge    #为了postget分开方便,不在这里组合接口名,在调用的地方组合接口名。

        return sArge

    #对于post请求,因为不知道连接格式是=还是冒号,或者是其他的格式,所以不做拼接。直接取参数的第一个作为上传body

    else:

        sArge=Data.read_data(SuiteID, Data.casebegin+CaseID, 3)

        if ’$$’ in sArge:#走关联分支

            args = sArge.split(’$$’)

            #print args

            corvalue = http://www.mamicode.com/Correl(args[0], args[1], args[2])

            if corvalue =http://www.mamicode.com/= []:

                sArge = ’correlerr’

                return sArge

            else:

                return sArge

程序开始之后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 = http://www.mamicode.com/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 = http://www.mamicode.com/rsps.read()

259                  data = http://www.mamicode.com/str(data)

260 B                conn.close()  

261                  return data

(Pdb) c                                    #执行命令c继续运行程序,直到断点就停留在此位置,上面设置断点的命令“b 260260表示第多少行

> 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 = http://www.mamicode.com/rsps.read()

259                  data = http://www.mamicode.com/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时,建议使用自己的程序,pdb单步调试方法总结如下:

命令

来源:博客园


Python学习之单步调试详解