我有一个Python程序,其中有一个函数foo()。
我使用 PDB 运行程序,并在程序内的任意断点处停止。
现在,我可以轻松地从 PDB 中调用 foo(),我只需键入:
!foo()
Run Code Online (Sandbox Code Playgroud)
foo 运行。一旦完成,它就会返回到 PDB,而我仍在程序之前所在的原始行等待。
但现在假设我希望 PDB在 foo内的断点处停止。我在源文件中的 foo() 的第一行设置了一个断点,然后执行 !foo()。
但 PDB 不会停在断点处。只有在程序内部调用 foo() 时,它似乎才会停止,而不是在程序运行时从 PDB 的命令行调用。
有人知道解决这个问题的方法吗?我搜索了 PDB 文档和 Google,但没有结果。
(我需要这样做的原因是因为我的程序需要一个小时来读取启动所需的所有数据,并且我需要能够在单个调试会话中尽可能多地进行调试,而不是简单地添加断点并重新启动-运行程序。因此,交互式调用函数并在其中调试它们的灵活性将非常有帮助。)
当我调试c代码时,我总是使用'gdb a.out < test'来重定向标准输入流。但当我真正做到的时候pdb,我发现它不起作用。在 pdb 帮助文档中搜索后,我仍然找不到与此问题相关的内容。
编辑:我发布我的代码。你能帮我将其更改为以最小的修改从文件中读取吗?谢谢。
cnt = int(raw_input())
paths = []
for cs in range(cnt):
action, path = map(None, (raw_input() + " dumb").split(" ", 1))
if (action == "pwd"):
print "/",
for p in paths:
print p + "/",
print
else:
strs = path.split("/")
for i in range(len(strs)):
p = strs[i]
if (p == ""):
continue
if (p == ".."):
paths.pop()
else:
paths.append(p)
Run Code Online (Sandbox Code Playgroud) 我想在 set.update() 函数上设置断点,但是当我尝试时,我收到一条错误消息。
例子:
ss= set()
ss.update('a')
Run Code Online (Sandbox Code Playgroud)
断点:
b set.update
b ss.update
Run Code Online (Sandbox Code Playgroud)
错误:
The specified object 'ss.update' is not a function
or was not found along sys.path.
The specified object 'set.update' is not a function
or was not found along sys.path.
Run Code Online (Sandbox Code Playgroud)
(注意,我还尝试在末尾加上括号,例如b set.update(),但仍然收到错误。我没有打印所有错误的排列。)
我试图找出导致我的应用程序出现 SEGFAULT 的原因,并设法将其追踪到某个模块。我在模块的某个函数中设置了跟踪:
def algorithm_wrapper(*args, **kwargs):
_version = version
if "Version" in kwargs:
_version = kwargs["Version"]
del kwargs["Version"]
algm = _framework.createAlgorithm(algorithm, _version)
pdb.set_trace()
_set_logging_option(algm, kwargs)
Run Code Online (Sandbox Code Playgroud)
如果我想检查局部变量_version和algm我收到以下错误:
-> _set_logging_option(algm, kwargs)
(Pdb) _version
NameError: name '_version' is not defined
(Pdb) algm
NameError: name 'algm' is not defined
Run Code Online (Sandbox Code Playgroud)
我很茫然,这是我第一次发现这个错误。请帮忙!
有什么方法可以列出 pdb 中另一个模块的行吗?
例如,如果我想在当前文件中设置断点,我可以使用“l”命令查找行号,并在该行上设置断点。
但是,如果我想在另一个文件中设置断点,可以通过语法在“b”命令中给出文件名,但是如何列出另一个文件以便找到我想要中断的行?
没有什么类似于在 gdb 中列出 FILE:LINENUM 吗?
注意:为了快速解释这一点,我将从 Spyder 工作的角度来讨论这一点。
如果在我的代码中调用 a 函数,我可以在调用它的位置旁边放置一个断点,然后当我的代码到达该点时,我可以单击“Step into function..”按钮来查看该函数内部发生了什么。
假设我处于某个任意断点,并且想要查看不在我的代码中的函数内部发生的情况。有什么方法可以通过 pdb 控制台调用此函数并“步入”所述函数调用吗?
在 Python(2.7,在 Linux 上运行)中调试脚本时,我偶尔会注入 pdb.set_trace()(注意我实际上使用的是 ipdb),例如:
import ipdb as pdb
try:
do_something()
# I'd like to look at some local variables before running do_something_dangerous()
pdb.set_trace()
except:
pass
do_something_dangerous()
Run Code Online (Sandbox Code Playgroud)
我通常从 shell 运行我的脚本,例如
python my_script.py
Run Code Online (Sandbox Code Playgroud)
有时在我的调试会话期间,我意识到我不想运行 do_something_dangerous()。停止程序执行以便 do_something_dangerous() 不运行并且我可以退出到 shell 的最简单方法是什么?
据我了解,按 ctrl-d (或发出调试器的退出命令)将简单地退出 ipdb 并且程序将继续运行(在我上面的示例中)。按 ctrl-c 似乎会引发 KeyboardInterrupt,但我从未理解引发它的上下文。
我希望像 ctrl-q 这样的东西可以简单地取消整个过程,但我找不到任何东西。
我知道我的示例是人为设计的,但我的问题是当正在调试的代码设置为捕获异常时如何从 pdb 中止执行。这不是关于如何重组上面的代码使其工作!
我正在从 TensorFlow 调试 decode_raw_op_test。测试文件是用 python 编写的,但它执行来自底层 C++ 文件的代码。
使用 pdb,我可以调试 python 测试文件,但是它不能识别 c++ 文件。有没有办法调试底层的 C++ 代码?
(我尝试在 decode_raw_op_test 上使用 gdb,但它给出了“文件不是可执行格式:文件格式无法识别”)
我目前的临时方法是记录到文本文件,但这不是很互动。我试过使用pdb,但这似乎与 urwid 不符,pdb一旦遇到断点就不会接受任何输入。
我一直在使用 Python 程序,这些程序需要几个小时才能完成,但偶尔会崩溃。为了调试,到目前为止,我一直在添加条件断点,每当出现问题时,这些断点都会让我进入 PDB 会话。这很好,因为查明问题的确切原因很难,交互式会话让我可以探索整个程序(包括所有堆栈帧等)。
唯一的问题是,如果我不小心关闭或崩溃了我的调试会话,我需要再次启动整个程序!达到我的断点需要几个小时!我会真的,真的像序列化PDB会话,并重新打开它多次的方式。这样的东西存在吗?我已经研究了 dill 来序列化一个解释器会话,不幸的是我的几种类型都无法序列化(它对代码更改也不是很健壮)。谢谢!
pdb ×10
python ×10
debugging ×4
dump ×1
gdb ×1
ipdb ×1
nameerror ×1
python-2.7 ×1
python-3.x ×1
spyder ×1
tensorflow ×1
urwid ×1