From: Christoph Z. <ci...@on...> - 2005-11-19 18:08:41
|
The ReleaseNotes for 0.9 say "AutoReload no longer catches servlet updates (since servlets can be reloaded without restarting the entire server anyway)." (This was checked in by Ian in Revision 1956). Generally, I'd say this is a good idea, but I noticed there is also a drawback: The exception traceback output does not use the updated source. If lines have been added or deleted from the source, it shows a wrong line as being erroneous. This makes debugging cumbersome. Anybody has an idea how this could be improved? Maybe simply reloading the source before printing the traceback? Any suggestions for a patch? -- Christoph |
From: Chuck E. <chu...@gm...> - 2005-11-19 18:20:55
|
On 11/19/05, Christoph Zwerschke <ci...@on...> wrote: > The ReleaseNotes for 0.9 say "AutoReload no longer catches servlet > updates (since servlets can be reloaded without restarting the entire > server anyway)." (This was checked in by Ian in Revision 1956). > > Generally, I'd say this is a good idea, but I noticed there is also a > drawback: The exception traceback output does not use the updated > source. If lines have been added or deleted from the source, it shows a > wrong line as being erroneous. This makes debugging cumbersome. > > Anybody has an idea how this could be improved? Maybe simply reloading > the source before printing the traceback? Any suggestions for a patch? > > -- Christoph I develop from a debugging environment (WingIDE) so instead of looking at the WebKit-generated traceback for the servlet, my dev environment gives it to me (correctly). When I run in production, I don't use AutoReload. So this problem doesn't affect me. I do remember experiencing it back when I didn't develop out of an IDE. My impression was that it was a bug in Python since the servlet's module *is* getting reloaded. Maybe if you can recreate the issue in a small standalone example, you can ask comp.lang.python for help. -Chuck |
From: Christoph Z. <ci...@on...> - 2005-11-19 22:09:01
Attachments:
test.py
|
> My impression was that it was a bug in Python since the servlet's > module *is* getting reloaded. Maybe if you can recreate the issue > in a small standalone example, you can ask comp.lang.python for help. Thanks for pointing me into the right direction. I checked this and you're right. The problem is Python, or specifically the linecache module used by traceback. The module is reloaded correctly, but the old source is still in the linecache. I have attached an example. * A test_module with an erroneous line is loaded: - the traceback is ok * Then, a line is added to the test_module and the module is reloaded: - now the traceback displays the wrong line * Finally, linecache.checkcache() is called and the module is reloaded: - now the traceback is ok again I noticed that this problem exists only with Python 2.3. It seems to be fixed in Python 2.4 already, so I think there is no need to discuss it in comp.lang.python. What I could do is add a linecache.checkcache() as a workaround. There are four modules where this could be added - I'm unsere where is the most appropriate place: ServletFactory, ImportSpy, AutoReloadingAppServer or ExceptionHandler? -- Christoph |
From: Chuck E. <chu...@gm...> - 2005-11-19 22:49:48
|
On 11/19/05, Christoph Zwerschke <ci...@on...> wrote: > I noticed that this problem exists only with Python 2.3. It seems to be > fixed in Python 2.4 already, so I think there is no need to discuss it > in comp.lang.python. > > What I could do is add a linecache.checkcache() as a workaround. > > There are four modules where this could be added - I'm unsere where is > the most appropriate place: > > ServletFactory, ImportSpy, AutoReloadingAppServer or ExceptionHandler? > > -- Christoph If it's fixed in Python 2.4, is simply upgrading an option? -Chuck |
From: Christoph Z. <ci...@on...> - 2005-11-20 11:25:19
|
> If it's fixed in Python 2.4, is simply upgrading an option? I have checked that again, and yes, it has been fixed in the traceback module a year ago and thus should be available since Python 2.4: http://cvs.sourceforge.net/viewcvs.py/python/python/dist/src/Lib/traceback.py?r1=1.30&r2=1.31 Unfortunately, I am bound to Python 2.3 currently, since customers and web hosts do not update so quickly. And I have set up my test/debug environment with the same version. Maybe others have the same problem. Officially, Webware only requires Python 2.0. We should think about changing that generally and get rid of a lot of workarounds and uglyness included in Webware to satisfy Python < 2.4. But for now, I think it's good to include a workaround for Python 2.3 so people may not stumble over the same problem and spend a lot of time searching for what's wrong. I have just checked in such a fix. It only updates the cache before printing the exception if run on Python < 2.4. -- Chris |
From: Ian B. <ia...@co...> - 2005-11-19 23:01:33
|
Christoph Zwerschke wrote: > The ReleaseNotes for 0.9 say "AutoReload no longer catches servlet > updates (since servlets can be reloaded without restarting the entire > server anyway)." (This was checked in by Ian in Revision 1956). > > Generally, I'd say this is a good idea, but I noticed there is also a > drawback: The exception traceback output does not use the updated > source. If lines have been added or deleted from the source, it shows a > wrong line as being erroneous. This makes debugging cumbersome. > > Anybody has an idea how this could be improved? Maybe simply reloading > the source before printing the traceback? Any suggestions for a patch? I'm pretty sure traceback lines are loaded with linecache; you could clear the cache everytime a reload is done. -- Ian Bicking | ia...@co... | http://blog.ianbicking.org |
From: Christoph Z. <ci...@on...> - 2005-11-20 11:34:14
|
Ian Bicking wrote: > I'm pretty sure traceback lines are loaded with linecache; you could > clear the cache everytime a reload is done. See last checkin. Python 2.4 updates the linecache before printing tracebacks; I'm doing the same manually for Python < 2.4 now. By the way, clearing the cache is not needed, you can just call checkcache(). Otherwise you would have to clear the whole cache, since it cannot be updated on a per module basis in Python < 2.4. -- Chris |