• 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 =  Data.read_data(SuiteID, Data.casebegin+CaseID, Data.argbegin+j)
                    if '$$' in ArgValue:#走关联分支
                        args = ArgValue.split('$$')
                        #print args
                        corvalue = Correl(args[0], args[1], args[2])
                        pdb.set_trace()   #######这儿设置断点,程序运行到此处就开始了单步调试###########
                        if corvalue == []:
                            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    #为了post和get分开方便,不在这里组合接口名,在调用的地方组合接口名。
            return sArge 
        #对于post请求,因为不知道连接格式是=还是冒号,或者是其他的格式,所以不做拼接。直接取参数的第一个作为上传body。
        else:
            sArge=Data.read_data(SuiteID, Data.casebegin+CaseID, 3)
            if '$$' in sArge:#走关联分支
                args = sArge.split('$$')
                #print args
                corvalue = Correl(args[0], args[1], args[2])
                if corvalue == []:
                    sArge = 'correlerr'
                    return sArge
                else:
                    return sArge

    程序开始之后pdb调试界面:

    > c:userswangchaoworkspaceinterface_test	estframe.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:userswangchaoworkspaceinterface_test estframe.py(254)HTTPInvoke()
    -> print url
    (Pdb) b 260 #设置断点
    Breakpoint 1 at c:userswangchaoworkspaceinterface_test estframe.py:260
    (Pdb) n
    > c:userswangchaoworkspaceinterface_test estframe.py(254)HTTPInvoke()
    -> print url
    (Pdb)
    http://yue.sogou.com/api/h5/v1/history/recharge/list?pageNo=1&pageSize=1
    > c:userswangchaoworkspaceinterface_test estframe.py(255)HTTPInvoke()
    -> conn.request(reqmethod.upper(), url,headers=reqHeaders)
    (Pdb) s # 上面通过执行n程序运行到调用函数的地方,使用s可以进入函数内部
    --Call--
    > c:python27libhttplib.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:python27libhttplib.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:userswangchaoworkspaceinterface_test estframe.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:userswangchaoworkspaceinterface_test estframe.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":"xe6x88x90xe5x8ax9f"}'
    (Pdb)

    总结:上面的程序是本人私有,因而不能全部上传,在练习pdb时,建议使用自己的程序,pdb单步调试方法总结如下:

    命令

     

    解释

    break 或 b 设置断点

    设置断点

    continue 或 c

    继续执行程序

    list 或 l

    查看当前行的代码段

    step 或 s

    进入函数

    return 或 r

    执行代码直到从当前函数返回

    exit 或 q

    中止并退出

    next 或 n

    执行下一行

    pp

    打印变量的值

    a

    查看全部栈内变量

  • 相关阅读:
    Linux查找日志技巧
    win10编辑hosts文件提示没有权限
    Viso 2019 下载与激活
    SpringBoot日志记录组件logback的配置解释
    webservice(axis)接口上传文件附件 及 用zlib解压缩
    axis2添加接口过程
    关于“finally block does not complete normally”警告提示
    webservice介绍与流程(杂)
    JDBC理解
    Myeclipse中调整xml中字体显示大小
  • 原文地址:https://www.cnblogs.com/wc554303896/p/7191158.html
Copyright © 2020-2023  润新知