How to use pdb to debug python in Linux environment

小云云
Release: 2018-03-30 16:20:49
Original
2835 people have browsed it


pdb is a package that comes with python. It provides an interactive source code debugging function for python programs. Its main features include setting breakpoints, single-step debugging, entering function debugging, viewing current code, viewing stack fragments, and dynamic Change the value of a variable, etc. pdb provides some commonly used debugging commands.

Description of common commands for pdb:

l You can enter the function
p variable #View variable value
b line number #break breakpoint is set to which line
b #break displays a list of all breakpoints
cl breakpoint number #clear delete a certain Breakpoints
Cl
 pdb setting breakpoints can be added to the program:
 import pdb
 Add pdb.set_trace() where you need to set breakpoints
  Execute python -m pdb test.py

The following describes how to use pdb for debugging with specific examples.


List 1. Test code example
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = " ccc"
final = a + b + c
print final

List 2. Debugging using 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)

Print the value of the variable: If you need to print the value of the variable during debugging, you can directly use p plus above the variable name, but it should be noted that printing can only see the specific value after the current statement has been executed, otherwise a NameError: < exceptions.NameError … ....> error will be reported.

List 3. Print variables during debug process
[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)

Use c to stop the current debug and allow the program to continue executing. If there are further statements of set_statement() in the following program, it will re-enter the debug state. Readers can add set_trace() verification before the code print final.


List 4. Stop debugging and continue executing the program
[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

Display code: The current code block may not be remembered during debugging. If you want to view a specific code block, you can display it by using the list or l command. list will use the arrow -> to point to the current debug statement.

List 6. Code displayed during debug process
[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 when using functions


Listing 6. Example of using functions
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

If you use n directly for debugging, it will be treated as an ordinary assignment when you reach the final=combine(a,b) sentence. Statement processing, enter print final. What if you want to debug a function? You can directly use s to enter the function block. Single-step debugging in the function is similar to the above introduction. If you don’t want to step through the function, you can press r directly at the breakpoint to exit to the calling place.

清单 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 &#39;= "avfe"&#39; is not a function 
 or was not found along sys.path. 
 (Pdb) !b="afdfd"
 (Pdb)
Copy after login

相关推荐:

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

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

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

The above is the detailed content of How to use pdb to debug python in Linux environment. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template