Search code examples
javatomcataopclassloaderinstrumentation

Debugging external libraries, without modifying them, under tomcat


We have a web application which sometimes (quite rarely, several times a day) gives an error in production. It is deployed on Tomcat, uses Spring+Hibernate, the error is caused by a Hibernate exception which is hard to understand without actually logging the parameters passed to the method of the Hibernate class. It is not possible to replace the Hibernate library with a modified version which logs the parameters, and spring-aop cannot be used since the "beans" are not managed. I have seen an example of byte code instrumentation using javassist, on http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html, however trying to run it under tomcat, the instrumented code does not seem to run, probably due to classloader problems which I currently don't understand.

What I am asking then, is this: does anyone know of a more or less simple way to instrument the byte code under tomcat for such a task as logging the parameters of methods in external libraries? is there some further insight you may give on this problem?


Solution

  • Have a look at BTrace.

    It will allow you to log calls to other classes/functions without slowing down the main application.