在Python调试器中,如何单步执行第二个方法调用?

时间:2018-09-07 22:38:27

标签: python debugging pdb ipdb

我正在尝试在Django中调试某些内容,并且在ipdb的某个时刻,我最终遇到了以下堆栈跟踪:

ipdb> u
> /Users/kurtpeek/Documents/Dev/lucy2/lucy-web/dashboard/views/base.py(191)get()
    190     def get(self, request, *args, **kwargs):
--> 191         self.object = self.get_object()
    192         return super().get(request, *args, **kwargs)

我想加入对get_object()的电话。但是,如果我输入s命令,它将进入self.object调用(这是对象的__get__方法,Django视图):

ipdb> s
--Call--
> /Users/kurtpeek/.local/share/virtualenvs/lucy-web-CVxkrCFK/lib/python3.7/site-packages/django/db/models/manager.py(176)__get__()
    175 
--> 176     def __get__(self, instance, cls=None):
    177         if instance is not None:

是否可以进入在线的第二个方法调用,而不是第一个?我尝试细读https://docs.python.org/3/library/pdb.html#debugger-commands上的命令,但找不到任何命令。

2 个答案:

答案 0 :(得分:1)

我相信您可以使用“ s”进入第一个功能,然后使用“ r”运行至功能结尾。从那里您应该能够进入第二个功能。

答案 1 :(得分:0)

这是一个与Django无关的示例,其中包含实际步骤。想要过度交流@Jason指出的内容。只要按照字面上的说明正确无误,我还是花了一些时间才能使它工作。

#example.py
import pdb

def fun_a(arg_a):
    res_a = arg_a + "-a"
    return res_a

def fun_b(arg_b):
    res_b = arg_b + "-b"
    return res_b 

def fun_final(res_a, res_b):
    res_final = res_a + res_b
    return res_final

pdb.set_trace()
fun_final(fun_a("first"), fun_b("second"))

运行调试器:

python3 example.py
[0] > .../example.py(16)<module>()
-> fun_final(fun_a("first"), fun_b("second"))
(Pdb++) s
--Call--
[1] > .../example.py(3)fun_a()
-> def fun_a(arg_a):
(Pdb++) r
--Return--
[1] > .../example.py(5)fun_a()->'first-a'
-> return res_a
(Pdb++) s
--Call--
[1] > .../example.py(7)fun_b()
-> def fun_b(arg_b):
(Pdb++) r
--Return--
[1] > .../example.py(9)fun_b()->'second-b'
-> return res_b
(Pdb++) s
--Call--
[1] > .../example.py(11)fun_final()
-> def fun_final(res_a, res_b):
(Pdb++) ll
  11  -> def fun_final(res_a, res_b):                                                                                                                                                                              
  12         res_final = res_a + res_b                                                                                                                                                                             
  13         return res_final                                                                                                                                                                                      

即使活动行显示s,也必须在r之后按return res_a。除了第一步之外,不要期望看到fun_final(fun_a("first"), fun_b("second"))