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:\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时,建议使用自己的程序,pdb单步调试方法总结如下:

命令

 

解释

break 或 b 设置断点

设置断点

continue 或 c

继续执行程序

list 或 l

查看当前行的代码段

step 或 s

进入函数

return 或 r

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

exit 或 q

中止并退出

next 或 n

执行下一行

pp

打印变量的值

a

查看全部栈内变量

转载于:https://www.cnblogs.com/wc554303896/p/7191158.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要增加脚本的单步调试功能,可以在代码执行的过程中,让用户逐步执行代码,同时查看每一步的结果。下面是一些可能实现该功能的步骤: 1. 创建一个断点列表,用于存储需要暂停执行的行号或语句。 2. 在脚本的执行过程中,每当执行到一个断点时,暂停执行并等待用户的输入。可以使用Python的input()函数等待用户输入。 3. 显示当前执行的语句以及相关的变量值和状态信息,以帮助用户理解当前代码执行的情况。可以使用Python的print()函数来实现这个功能。 4. 提供一些命令,例如“step”、“continue”、“break”等,以允许用户控制程序的执行。例如,“step”命令将使程序执行下一条语句,而“continue”命令将使程序继续执行直到下一个断点。 5. 当程序执行完成时,提示用户已经完成。 下面是一个简单的Python脚本,可以通过增加单步调试功能实现上述功能: ``` import pdb def add(a, b): c = a + b return c def main(): pdb.set_trace() x = 1 y = 2 z = add(x, y) print(z) if __name__ == '__main__': main() ``` 在上述脚本中,我们在main()函数的第一行添加了pdb.set_trace()语句,这会在执行该函数时打开调试器。当程序执行到这一行时,它会暂停执行并等待用户输入命令。此时可以输入命令来查看和修改变量值,或者逐步执行代码。 使用pdb调试器的详细信息可以参考Python官方文档中的文档:https://docs.python.org/3/library/pdb.html ### 回答2: 要在上述设计的基础上增加对脚本的单步调试功能,可以通过以下几个步骤实现。 首先,增加一个控制流程的变量,用于记录当前代码的执行位置。这个变量可以是一个递增的整数,表示代码的行数或指令的位置。 其次,修改执行脚本的函数,使其根据控制流程变量的值,逐行或逐条地执行代码。在执行每个代码行之前,可以在控制台输出当前执行的代码行号和代码内容,提供给用户参考。 接着,增加一个命令行接口或者用户界面,用于控制脚本的单步调试。用户可以通过输入命令,暂停脚本的执行,继续执行下一条指令,查看变量的取值等。可以为每个命令定义一个特定的关键字或符号,并在代码执行过程中监听用户的输入。 同时,为了方便用户调试代码,可以增加错误处理和异常捕获机制。当脚本出现错误或异常时,暂停脚本的执行,并输出错误信息。用户可以根据错误信息进行调试和修复代码。 最后,为了提高脚本的可读性和可调试性,可以在开发工具中增加代码高亮、断点设置和查看变量值等功能。这些功能可以帮助用户更直观地理解和调试代码。 通过以上步骤的实现,可以在原有设计的基础上增加对脚本的单步调试功能。用户可以逐行执行代码,查看代码执行过程中的变量值,并通过命令行或用户界面掌控脚本的执行流程,实现脚本的调试和问题排查。 ### 回答3: 要在设计中增加对脚本的单步调试功能,可以采取以下步骤: 1. 添加断点功能:在设计中添加一个断点选项,让用户能够在脚本运行过程中选择性暂停执行。可以通过点击脚本特定行或在代码中插入断点来实现。 2. 实现单步执行:增加一个单步执行选项,让用户能够逐行执行代码。当用户选择单步执行时,每次执行一行代码并暂停,等待用户进一步操作。 3. 提供调试窗口:在设计中添加一个调试窗口,用于显示当前代码的执行状态和变量的值。该窗口可以显示当前执行到的代码行、变量的值,并允许用户在执行过程中查看和修改变量的值。 4. 支持变量监视:在调试窗口中添加一个变量监视功能,允许用户选择需要监视的变量,并在每次执行暂停时显示其当前值。这样用户可以实时监视和调整变量的值,以便更好地了解脚本的执行过程。 5. 提供调试控制选项:在设计中增加调试控制选项,例如继续执行、跳过当前断点、单步跳过函数调用等,使用户能够根据需要控制脚本的执行流程。 6. 异常处理与错误提示:在脚本运行过程中,当发生错误或异常时,设计应能显示相关错误信息,并提供相应的处理选项。这样用户可以更好地定位和调试代码中的问题。 7. 记录脚本执行过程:在设计中添加脚本执行记录功能,将每次脚本的执行过程和状态记录下来。这对于在脚本长时间执行或调试过程中出现问题时进行回溯和分析非常有帮助。 通过以上设计改进,用户可以更好地进行脚本的单步调试,定位和解决问题,提高脚本的开发和调试效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值