进入回调函数时PDB突然异常

sudden exceptions in PDB when entering a callback function

我正在尝试调试我的 python 应用程序,它使用 "mailbot" 模块和触发的用户回调。当收到特定电子邮件时会触发这些。昨天,使用 PDB 调试应用程序工作得很好,我差不多完成了我的工作。但今天似乎世界已经改变了......我不记得从昨天开始更改过任何相关代码,但是当我在 PDB 设置中调用我的应用程序时,它会导致许多我不知道如何解释的异常。

当省略 PDB 并使用 python application.py 启动应用程序时,应用程序运行良好。所以(错误消息也表明了这一点),问题似乎与我的应用程序、回调的使用或 mailbot 模块无关。

这是错误消息出现之前的故事。抱歉,好像有点长。

正在以 PDB 模式启动 python...

C:\...> python -m pdb application.py
> c:\...\application.py(2)<module>()
-> from __future__ import print_function

设置断点到异常前一步...

(Pdb) b c:\PROGS\Python34\Lib\site-packages\mailbot\mailbot.py:52
Breakpoint 1 at c:\progs\python34\lib\site-packages\mailbot\mailbot.py:52

开始执行直到断点...

(Pdb) c
> c:\progs\python34\lib\site-packages\mailbot\mailbot.py(52)process_message()
-> return callback.trigger()

显示相关列表...

(Pdb) l
 47
 48         def process_message(self, message, callback_class, rules):
 49             """Check if callback matches rules, and if so, trigger."""
 50             callback = callback_class(message, rules)
 51             if callback.check_rules():
 52 B->             return callback.trigger()
 53
 54         def process_messages(self):
 55             """Process messages: check which callbacks should be triggered."""
 56             from . import CALLBACKS_MAP
 57             self.reset_timeout_messages()

正在检查下一条语句...

(Pdb) callback.trigger
<bound method cbLookUpMindmapAndSendText.trigger of <callbacks.cbLookUpMindmapAndSendText object at 0x02EB95B0>>

正在进入回调...

(Pdb) s
--Call--
Traceback (most recent call last):
  File "C:\PROGS\Python34\lib\pdb.py", line 1661, in main
    pdb._runscript(mainpyfile)
  File "C:\PROGS\Python34\lib\pdb.py", line 1542, in _runscript
    self.run(statement)
  File "C:\PROGS\Python34\lib\bdb.py", line 431, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "c:\...\application.py", line 25, in <module>
    mailbox.process_messages()
  File "C:\PROGS\Python34\lib\site-packages\mailbot\mailbot.py", line 64, in process_messages
    self.process_message(message, callback_class, rules)
  File "C:\PROGS\Python34\lib\site-packages\mailbot\mailbot.py", line 52, in process_message
    return callback.trigger()
Traceback (most recent call last):
  File "C:\PROGS\Python34\lib\pdb.py", line 1661, in main
    pdb._runscript(mainpyfile)
  File "C:\PROGS\Python34\lib\pdb.py", line 1542, in _runscript
    self.run(statement)
  File "C:\PROGS\Python34\lib\bdb.py", line 431, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "c:\...\application.py", line 25, in <module>
    mailbox.process_messages()
  File "C:\PROGS\Python34\lib\site-packages\mailbot\mailbot.py", line 64, in process_messages
    self.process_message(message, callback_class, rules)
  File "C:\PROGS\Python34\lib\site-packages\mailbot\mailbot.py", line 52, in process_message
    return callback.trigger()
  File "C:\...\callbacks.py", line 20, in trigger
  File "C:\PROGS\Python34\lib\bdb.py", line 50, in trace_dispatch
    return self.dispatch_call(frame, arg)
  File "C:\PROGS\Python34\lib\bdb.py", line 82, in dispatch_call
    self.user_call(frame, arg)
  File "C:\PROGS\Python34\lib\pdb.py", line 249, in user_call
    self.interaction(frame, None)
  File "C:\PROGS\Python34\lib\pdb.py", line 345, in interaction
    self.print_stack_entry(self.stack[self.curindex])
  File "C:\PROGS\Python34\lib\pdb.py", line 1447, in print_stack_entry
    self.format_stack_entry(frame_lineno, prompt_prefix))
  File "C:\PROGS\Python34\lib\bdb.py", line 411, in format_stack_entry
    line = linecache.getline(filename, lineno, frame.f_globals)
  File "C:\PROGS\Python34\lib\linecache.py", line 15, in getline
    lines = getlines(filename, module_globals)
  File "C:\PROGS\Python34\lib\linecache.py", line 41, in getlines
    return updatecache(filename, module_globals)
  File "C:\PROGS\Python34\lib\linecache.py", line 127, in updatecache
    lines = fp.readlines()
  File "C:\PROGS\Python34\lib\codecs.py", line 319, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 351: invalid start byte

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\PROGS\Python34\lib\runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\PROGS\Python34\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\PROGS\Python34\lib\pdb.py", line 1685, in <module>
    pdb.main()
  File "C:\PROGS\Python34\lib\pdb.py", line 1673, in main
    traceback.print_exc()
  File "C:\PROGS\Python34\lib\traceback.py", line 252, in print_exc
    print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
  File "C:\PROGS\Python34\lib\traceback.py", line 169, in print_exception
    for line in _format_exception_iter(etype, value, tb, limit, chain):
  File "C:\PROGS\Python34\lib\traceback.py", line 153, in _format_exception_iter
    yield from _format_list_iter(_extract_tb_iter(tb, limit=limit))
  File "C:\PROGS\Python34\lib\traceback.py", line 18, in _format_list_iter
    for filename, lineno, name, line in extracted_list:
  File "C:\PROGS\Python34\lib\traceback.py", line 65, in _extract_tb_or_stack_iter
    line = linecache.getline(filename, lineno, f.f_globals)
  File "C:\PROGS\Python34\lib\linecache.py", line 15, in getline
    lines = getlines(filename, module_globals)
  File "C:\PROGS\Python34\lib\linecache.py", line 41, in getlines
    return updatecache(filename, module_globals)
  File "C:\PROGS\Python34\lib\linecache.py", line 127, in updatecache
    lines = fp.readlines()
  File "C:\PROGS\Python34\lib\codecs.py", line 319, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 351: invalid start byte

C:\...>

任何提示,在哪里或如何寻求解决方案?

谢谢。 nnako

最后,我通过尝试在 Linux 机器上 运行 应用程序找到了解决方案。 运行 它在 Windows 上(没有 PDB)导致没有错误。 Linux 在尝试 运行 命令 python application.py:

时显示了这个输出
Traceback (most recent call last):
  File "application.py", line 12, in <module>
    import callbacks
  File "/home/pi/examples/callbacks.py", line 16
SyntaxError: Non-ASCII character '\xfc' in file /home/pi/examples/callbacks.py on line 16, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

所以我发现奇怪的是隐藏在注释行某处的不可打印字符“\xfc”引起的。删除该行并重新输入其内容解决了这个问题。尽管我不知道这怎么可能导致上面 post 中描述的异常消息。

希望有一天,这会对某人有所帮助。

谢谢。 nnako