Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

42 Commits

Repository files navigation

基于标准库 bdb.py 和 pdb.py 构建

1. 增加添加源代码目录功能

 source dir A ------- __init__.py
'
'-------- sr1.py
'
'-------- dir B ---- sr2.py
可以直接用 break "src2.py":11|funcname [condition] 来设置断点

2. 增加 watch variable 功能:

 1	class A(object):
2 def __init__(self, value=0):
3 self.value = value
4 5 def set_value(self, value):
6 self.value = value
7 8 9	class B(object):
10 def __init__(self, my_a):
11 self.my_a = my_a
12 13 def set_a(self, value):
14 self.my_a.set_value(value)
15 16	a = A()
17	b = B(a) ---- 假设在此处增加断点 watch a.value
18
19 20	def uu():
21 for i in range(8):
22 if i %3 == 0:
23 b.set_a(i) ----- i = 3, 6, 9 时会触发断点
24 25 print i
26 27 28	uu()
29 具体的执行结果如下:
1	> /home/lisp/src/xpdb/cc.py(1)<module>()
2	-> class A(object):
3	(Pdb) n
4	> /home/lisp/src/xpdb/cc.py(9)<module>()
5	-> class B(object):
6	(Pdb) n
7	> /home/lisp/src/xpdb/cc.py(16)<module>()
8	-> a = A()
9	(Pdb) n
10	> /home/lisp/src/xpdb/cc.py(17)<module>()
11	-> b = B(a)
12	(Pdb) n
13	> /home/lisp/src/xpdb/cc.py(18)<module>()
14	-> import sys
15	(Pdb) watch a.value
16	Succ to Add Watch Point
17	(Pdb) c
18	0
19	1
20	2
21 WatchPoint a.value: Old Value = 0, New Value = 3 --- 触发断点
22	> /home/lisp/src/xpdb/cc.py(25)uu()
23	-> print i
24	(Pdb) c
25	3
26	4
27	5
28 WatchPoint a.value: Old Value = 3, New Value = 6 --- 触发断点
29	> /home/lisp/src/xpdb/cc.py(25)uu()
30	-> print i
31	(Pdb) c
32	6
33	7
34	8

3.增加步进功能:

 next nums step nums (不能精确控制, 因为 cPython 内部调试框架会处理 call 和 return 等事件.导致当有 函数调用等事件发生时会进入 pdb 交互式环境)
step/next nums (如果 nums 是负数则当 nums = 1 处理)

4.增加 finish 命令

  • 1:功能等同 gdb finish 命令
  • 2:如果 while 或者 for 循环运行模块命名空间则不会有任何效果(运行在函数命名空间里才有效),如 假设 xxx.py 的代码如下
 import sys
while i in range(9):
print i
------ 在这个 while 循环体内调用 finish 命令将没有任何作用
print i*2
  • 3: 注意对以下代码(不完全)
def uu():
for j in range(3): for i in range(2):
if i %3 == 0:
b.set_a(i)
print i
i = 3*2 uu()
(Pdb) s
> /home/lisp/src/xpdb/cc.py(22)uu()
-> for j in range(3): (Pdb) finish --- 在此处 执行finish 命令将会finish 掉 函数 uu而不是 for j in range(3) 循环 【因为 pdb 提示的是下一行将运行的代码,
0 即此时还没有进入 for j in range(3) 内, 所以 finish 掉函数 uu 而不是 for 循环】
1
0
1
0
1
The program finished and will be restarted

5. 增加命令 'shell'

invoke bash 进入交互式环境

6. 增加命令 logon main.log 控制台中的打印信息会 dump 到 main.log 中。logoff 会取消 dump

7. 增加自定义命令:执行 repeat_times 次在断点处会自动触发 repeat_func 函数

8. 增加命令 source:source filename 会逐一执行文件中存在的 xpdb 命令

9. 增加命令 edit xx:会启动 emacs 进行编辑 xx 文件

10. 增加历史命令功能:能查询执行过的历史命令和 dump 历史命令到文件

待增加功能:

  • 1: 输出格式的美化
 如 (Pdb) while f: print f; f = f.f_back 将被替换为
while f:
------ print f
------ f = f.f_back
------
  • 2: 支持自定义命令: 如 gdb 哪有的自定义命令和从配置文件中读取已有的命令定义

  • ~~ 3: 支持设置变量值

  • 4: pydb jump, return命令支持

  • 5:rwatch 变量 (不可实现)

About

a python debugger based on pdb

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages