在Python调试器中,如何单步进入一行中的第二个方法调用?
In the Python debugger, how to step into the second method call on a line?
我正在尝试在 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 上的命令,但找不到任何命令。
我相信您可以使用“s”进入第一个函数,然后 运行使用“r”结束函数。从那里你应该能够进入第二个功能。
这是一个与 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
即使活动行显示 return res_a
,您也必须在 r
之后按 s
。不要指望在初始步骤之外看到 fun_final(fun_a("first"), fun_b("second"))
。
我正在尝试在 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 上的命令,但找不到任何命令。
我相信您可以使用“s”进入第一个函数,然后 运行使用“r”结束函数。从那里你应该能够进入第二个功能。
这是一个与 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
即使活动行显示 return res_a
,您也必须在 r
之后按 s
。不要指望在初始步骤之外看到 fun_final(fun_a("first"), fun_b("second"))
。