找到在stdout上打印一些调试内容的源代码行

时间:2017-04-04 15:01:08

标签: python debugging stdout

我面前有一个巨大的代码库,找不到将这些字符串打印到stdout的地方:

[{}]

我可以重现它,但到目前为止搜索相关的代码行还没有成功。

我想这是由开发人员意外添加的,以帮助调试。

有任何线索如何找到将此字符串发送到stdout的匹配代码行?

1 个答案:

答案 0 :(得分:2)

如果此行如下所示,您可以找到相关的源代码行引发异常:

class WrapperOfStdout():
    def __init__(self, old_stdout):
        self.old_stdout=old_stdout

    def write(self, data):
        assert not '{}' in data, data
        return self.old_stdout.write(data)

将此包装器添加到您的脚本中,并尽早包装stdout(在main之后不久):

sys.stdout=WrapperOfStdout(sys.stdout)

你会得到一个像这样的例外:

Traceback (most recent call last):
  File "/home/u/src/foo-bar/foo_bar/utils/common.py", line 94, in issue_to_tar
    meta = issuemeta(request, issue).encode('utf8')
  File "/home/u/src/foo/foo/views/issue/view.py", line 198, in issue_meta
    div = index_model.view(issue, request)
  File "/home/u/src/foo/foo/utils/indexutils.py", line 96, in view
    form = form_cls(request, issue, None, prefix=prefix)
  File "/home/u/src/foo-x/foo_x/logic/forms.py", line 115, in __init__
    print(fake_initial)
  File "/home/u/tmp/issue_to_tar.py", line 13, in write
    assert not '{}' in data, data
AssertionError: [{}]

现在您可以看到不需要的输出发生的位置。在这种情况下,它是logic/forms.py第115行。