2014-04-04 44 views
0

在下面的堆栈跟踪中,我错过了上部帧。异常回溯:上部帧丢失

谁在ioloop.py行458中调用了callback()?

stacktrace来自unittest TestCase。所有的测试都通过了,但是这个回溯在日志中是可重复的。

我看不到TestCase在哪个测试中引发异常。

ERROR [25950] Exception in callback <functools.partial object at 0x5358368> 
Traceback (most recent call last): 
    File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/ioloop.py", line 458, in _run_callback 
    callback() 
    File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/stack_context.py", line 331, in wrapped 
    raise_exc_info(exc) 
    File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/stack_context.py", line 302, in wrapped 
    ret = fn(*args, **kwargs) 
    File "/home/modwork_foo_dtg/src/websocketrpc/websocketrpc/client.py", line 71, in connect 
    self.ws = websocket_connect(self.args.url) 
    File "/home/modwork_foo_dtg/src/websocketrpc/websocketrpc/client.py", line 179, in websocket_connect 
    conn = websocket.WebSocketClientConnection(io_loop, request) 
    File "/home/modwork_foo_dtg/lib/python2.7/site-packages/tornado/websocket.py", line 777, in __init__ 
    raise Exception('%s %s' % (request, request.url)) 
Exception: <tornado.httpclient._RequestProxy object at 0x535cb10> None 

我该如何使用龙卷风查看上层堆栈跟踪帧?

异常本身不是问题。

+0

不错的博客解释为什么上面的帧丢失:http://blog.dscpl.com.au/2015/03/generating-full-stack-traces-for.html – guettli

回答

0

回调由ioloop.py:458调用,就像它说的那样。没有显示外部堆栈帧,因为异常没有转义该帧。让你感到困惑的是回调继续重新引发之前捕获的异常。

在Python 2中,保留追溯以后重新加载很麻烦(它在Python 3中变得更好)。龙卷风通常在这里做正确的事情,但是有一些差距在回溯将被截断。我在当前版本中知道的主要问题是AsyncHTTPClient倾向于丢弃回溯(并且在解决此问题时存在一些烦人的向后兼容性问题)。

作为调试时的一个粗略的解决方法,您可以在引发异常之前尝试打印traceback.format_stack(至少在可以修改代码的位置,正如您在此处为websocket.py添加异常所做的那样)。