Linux环境使用pdb调试python的方法

pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令。

       pdb的常用命令说明: 

  l                 #list查看运行到哪行代码 
  n             #next单步运行,跳过函数 
  s             #step单步运行,可进入函数 
  p 变量     #查看变量值 
  b 行号     #break断点设置到第几行 
  b             #break显示所有断点列表 
  cl 断点号 #clear删除某个断点 
  cl             #clear删除所有断点 
  c             #continue跳到下一个断点 
  r             #return当前函数 
  exit         #退出

调试记录:
  pdb设置断点可以在程序里加入:
  import pdb
  在需要设置断点的地方加入pdb.set_trace()
  执行python -m pdb test.py

下面结合具体的实例讲述如何使用 pdb 进行调试。

清单 1. 测试代码示例
import pdb 
 a = “aaa”
 pdb.set_trace() 
 b = “bbb”
 c = “ccc”
 final = a + b + c 
 print final

清单 2. 利用 pdb 调试
[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = “bbb”
 (pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = “ccc”
 (pdb) 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (pdb) list 
  1     import pdb 
  2     a = “aaa”
  3     pdb.set_trace() 
  4     b = “bbb”
  5     c = “ccc”
  6  -> final = a + b + c 
  7     print final 
 [eof] 
 (pdb) 
 [eof] 
 (pdb) n 
 > /root/epdb1.py(7)?() 
 -> print final 
 (pdb)

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 nameerror: 错误。

清单 3. debug 过程中打印变量
[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = “bbb”
 (pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = “ccc”
 (pdb) p b 
‘bbb’
 (pdb) 
‘bbb’
 (pdb) n 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (pdb) p c 
‘ccc’
 (pdb) p final 
 *** nameerror:  
 (pdb) n 
 > /root/epdb1.py(7)?() 
 -> print final 
 (pdb) p final 
‘aaabbbccc’
 (pdb)

使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。

清单 4. 停止 debug 继续执行程序
[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = “bbb”
 (pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = “ccc”
 (pdb) c 
 aaabbbccc

显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。

清单 6. debug 过程中显示代码
[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = “bbb”
 (pdb) list 
  1     import pdb 
  2     a = “aaa”
  3     pdb.set_trace() 
  4  -> b = “bbb”
  5     c = “ccc”
  6     final = a + b + c 
  7     pdb.set_trace() 
  8     print final 
 [eof] 
 (pdb) c 
 > /root/epdb1.py(8)?() 
 -> print final 
 (pdb) list 
  3     pdb.set_trace() 
  4     b = “bbb”
  5     c = “ccc”
  6     final = a + b + c 
  7     pdb.set_trace() 
  8  -> print final 
 [eof] 
 (pdb)

在使用函数的情况下进行 debug

清单 6. 使用函数的例子
import pdb 
 def combine(s1,s2):      # define subroutine combine, which… 
    s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, … 
    s3 = ‘”‘ + s3 +'”‘   # encloses it in double quotes,… 
    return s3            # and returns it. 
 a = “aaa”
 pdb.set_trace() 
 b = “bbb”
 c = “ccc”
 final = combine(a,b) 
 print final

如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。

清单 7. 对函数进行 debug
[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = “bbb”
 (Pdb) n 
 > /root/epdb2.py(11)?() 
 -> c = “ccc”
 (Pdb) n 
 > /root/epdb2.py(12)?() 
 -> final = combine(a,b) 
 (Pdb) s 
 –Call– 
 > /root/epdb2.py(3)combine() 
 -> def combine(s1,s2):      # define subroutine combine, which… 
 (Pdb) n 
 > /root/epdb2.py(4)combine() 
 -> s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, … 
 (Pdb) list 
  1     import pdb 
  2 
  3     def combine(s1,s2):      # define subroutine combine, which… 
  4  ->     s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, … 
  5         s3 = ‘”‘ + s3 +'”‘   # encloses it in double quotes,… 
  6         return s3            # and returns it. 
  7 
  8     a = “aaa”
  9     pdb.set_trace() 
 10     b = “bbb”
 11     c = “ccc”
 (Pdb) n 
 > /root/epdb2.py(5)combine() 
 -> s3 = ‘”‘ + s3 +'”‘   # encloses it in double quotes,… 
 (Pdb) n 
 > /root/epdb2.py(6)combine() 
 -> return s3            # and returns it. 
 (Pdb) n 
 –Return– 
 > /root/epdb2.py(6)combine()->'”aaabbbaaa”‘
 -> return s3            # and returns it. 
 (Pdb) n 
 > /root/epdb2.py(13)?() 
 -> print final 
 (Pdb)

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用!b。

清单 8. 在调试的时候动态改变值
[root@rcc-pok-idg-2255 ~]# python epdb2.py 

> /root/epdb2.py(10)?()  -> b = "bbb" (Pdb) var = "1234" (Pdb) b = "avfe" *** The specified object '= "avfe"' is not a function  or was not found along sys.path.  (Pdb) !b="afdfd" (Pdb)

登录后复制

相关推荐:

用Pdb库调试Python的方式及常用的命令

立即学习“Python免费学习笔记(深入)”;

使用PDB模式调试Python程序介绍

使用PDB简单调试Python程序简明指南

以上就是Linux环境使用pdb调试python的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2265462.html

(0)
上一篇 2025年2月27日 08:43:40
下一篇 2025年2月20日 04:47:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vscode无法调试python怎么解决

    本文主要和大家分享vscode无法调试python怎么解决,希望能帮助到大家。 vscode无法调试python问题 提示调试适配器出错 1、保证已安装python调试插件,并升级到最新版本。 2、查看Python版本,升级到最新版本。 3…

    编程技术 2025年2月27日
    200
  • Python语法基础详解

    本文主要和大家分享python语法基础详解,希望能帮助到大家。 Python注释 ”’多行注释”’井号单行注释 登录后复制 python2在文件中存在中文的情况下,必须加以理(两种方式) 在文件头加上#coding=utf-8 在文件头…

    编程技术 2025年2月27日
    200
  • python编程的一些习惯

    本文主要和大家分享python编程的一些习惯,主要以代码的方式和大家讲解,希望能帮助到大家。 1、写好程序文档(格式、自动缩进(vim设置行宽和autoindent)、注释)如下形式: 2、尽量精简代码: 如     可以写成: retur…

    2025年2月27日
    100
  • python动态爬虫的实例分享

    本文主要和大家分享python动态爬虫的实例分享,用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字。如下所示: #encoding=utf-8 登录后复制 imp…

    2025年2月27日 编程技术
    200
  • Python解析JSON的实例分享

    本文主要和大家分享Python解析JSON的实例,主要以代码的形式和大家讲解,希望能帮助到大家 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。Python 使用 JSON 函…

    编程技术 2025年2月27日
    200
  • Python迭代模式实例详解

    本文主要和大家分享python迭代模式实例详解,主要以代码的形式和大家分享,希望能帮助到大家。 # -*- coding: utf-8 -*-“””Created on Thu Mar 29 11:43:05 2018@author: mz…

    编程技术 2025年2月27日
    200
  • python获取人脸的代码分享

    本文主要和大家分享python获取人脸的代码分享,希望大家根据本文能完成python获取人脸的功能。 usage:python   getface.py     src       out # -*- codeing: utf-8 -*-i…

    编程技术 2025年2月27日
    200
  • Python元组的知识详解

    本文主要和大家分享Python元组的知识详解没希望能帮助到大家。 1、Python的元组与列表类,不同之处:     a、元组的元素不能修改,列表可以。     b、元组使用小括号,列表使用方括号。 2、元组创建很简单,只需要在括号中添加元…

    编程技术 2025年2月27日
    200
  • Python实现管理站点的方法

    本文主要和大家分型分享Python实现管理站点的方法,主要以代码的方式和大家讲解,希望能帮助到大家。 一、django后台管理页面 Django内置了后台管理页面,只需要配置一下就可以使用,这免除了开发者在开发完站点之后还要去做一个后台管理…

    2025年2月27日
    200
  • 两个python实现切换功能

    本文主要和大家分享两个python实现切换功能,希望能帮助到大家。 # 安装好后,使用activate激活某个环境activate python34 # for windowssource activate python34 # for l…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论