遇到大型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

查看全部栈内变量

Python如何实现单步调试的更多相关文章

  1. [Python]-pdb模块-单步调试

    使用pdb模块辅助python调试. import pdb 断点模式 在需要调试的语句前设置断点,加入这行代码: pdb.set_trace() 程序运行到这就会进入断点调试模式. 输入 作用 n 运 ...

  2. Python - 单步调试

    Python 有一个单步调试器模块,能实现基本的调试效果!详情请看Python标准文档说明:https://docs.python.org/2/library/pdb.html 调试例子: >& ...

  3. Python的功能模块[4] -> pdb/ipdb -> 实现 Python 的单步调试

    pdb / ipdb 模块 / pdb / ipdb Module pdb 和 ipdb 的主要作用是用于 Python 程序的单步调试,Python 的调试可参考链接. 下面是一个简单的使用示例 i ...

  4. 使用spyder编译器单步调试python

    1.将需要进行单步调试的函数在脚本中进行调用(十分重要的一步).由于python是解释型语言,在进行单步调试的时候需要告诉系统你使用了这个函数,单步调试才会进入你所需要调式的函数.如下图所示,我们定义 ...

  5. Python程序高效地调试

    现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位python大神一般是怎么debug ...

  6. python 源代码分析之调试设置

    首先在官方下载源代码,我下载的是最新版本3.4.3版本:https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz 解压后的目录如下(借用网上的目 ...

  7. Android Studio xcode单步调试 WebRTC Android & iOS

    mac环境 如何在 Android Studio 里单步调试 WebRTC Android 的 native 代码. WebRTC 代码下载 depot tools 是 chromium 代码库管理工 ...

  8. Python 代码使用pdb调试技巧

    Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug.python 提供了一系列 debug 的工具和包,可供我们选择.本文将主要阐述如何利用 pyt ...

  9. 转 Python3 错误和异常/ Python学习之错误调试和测试

    ########sample 0 https://www.cnblogs.com/Simon-xm/p/4073028.html except: #捕获所有异常 except: <异常名> ...

随机推荐

  1. 关于querySelectorAll的一个坑

    刚学JS的DOM操作时,就知道了匹配一堆元素,会获得NodeList和HTMLCollection这两个对象,不过当时并没有深入去研究两者的区别 因为无论是NodeList还是HTMLCollecti ...

  2. cuda学习3-共享内存和同步

    为什么要使用共享内存呢,因为共享内存的访问速度快.这是首先要明确的,下面详细研究. cuda程序中的内存使用分为主机内存(host memory) 和 设备内存(device memory),我们在这 ...

  3. 点评阿里JAVA手册之编程规约(命名风格、常量定义、代码风格、控制语句、注释规约)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文难度系数为一星(★) 码出高效.码出质量. 代码的字里行间流淌的是 ...

  4. sql备份(.mdf文件备份)

    第一步: 右键需要备份的数据库(这里以MyDB为例),选择“属性”. 第二步: 选择“文件”,复制路径 第三步: 打开文件所在目录,复制MyDB.mdf和MyDB_log.ldf 第四步: 把数据库停 ...

  5. Kafka.net使用编程入门(四)

    新建一个cmd窗口,zkServer命令启动zookeeper 打开另一个cmd窗口,输入: cd D:\Worksoftware\Apachekafka2.11\bin\windows kafka- ...

  6. Node.js爬虫-爬取慕课网课程信息

    第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...

  7. NodeJs的简单介绍

    Nodejs是由谷歌v8运行.c++编写的js运行的环境,这里需要记住的是Nodejs只是一个环境.  目前很多主流网站都是使用nodejs,如知乎等大型的网站. 我们关于nodejs学习目标:安装N ...

  8. vue-cli webpack在node环境下安装使用

    第一步,需要下载并安装node.js以及他的npm组件: 第二步,用node -v;npm -v来测试node.js以及npm是否安装成功(建议用GIT命令行工具,因为GIT是linux系统),如果显 ...

  9. 为什么使用dojo?dojo与jquery有什么不同?dojo适合什么开发场景?

    首先介绍一下dojo的特性: 1.Dojo是一个符合AMD规范的企业级框架(dojo是一个重量级框架) 2.Dojo全面支持异步加载JS机制(即:支持通过require异步加载JS模块,通过defin ...

  10. 在ROS中使用花生壳的域名服务

    ROS功能强大,也比较复杂,各个版本的脚本可能也大同小异,我现在使用的是6.37.3的版本. 添加Script 进入菜单System->Scripts. 点击加号,像图中这样,添加代码,我给这段 ...