【发布时间】:2013-05-31 16:51:12
【问题描述】:
想学习tomcat运行的内部原理,了解流程。
为此我创建了一个 servlet -
public class TestServlet extends HttpServlet {
//Breakpoint set on constructor
public TestServlet() {
}
}
我在源代码查找目录中包含了 tomcat 源代码,并以调试模式启动了服务器。以下是调试器在我的断点处停止时的堆栈跟踪 -
Daemon Thread [localhost-startStop-1] (Suspended (entry into method <init> in TestServlet))
owns: StandardWrapper (id=39)
owns: StandardContext (id=40)
TestServlet.<init>() line: 12
NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]
NativeConstructorAccessorImpl.newInstance(Object[]) line: 39
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 27
Constructor<T>.newInstance(Object...) line: 513
Class<T>.newInstance0() line: 355
Class<T>.newInstance() line: 308
DefaultInstanceManager.newInstance(String) line: 138
StandardWrapper.loadServlet() line: 1144
StandardWrapper.load() line: 1088
StandardContext.loadOnStartup(Container[]) line: 5123
StandardContext.startInternal() line: 5407
StandardContext(LifecycleBase).start() line: 150
ContainerBase$StartChild.call() line: 1559
ContainerBase$StartChild.call() line: 1549
FutureTask$Sync.innerRun() line: 303
FutureTask<V>.run() line: 138
ThreadPoolExecutor$Worker.runTask(Runnable) line: 886
ThreadPoolExecutor$Worker.run() line: 908
Thread.run() line: 662
如您所见,tomcat 启动了一个新的守护线程来处理TestServlet 的初始化。如果我从这个位置走出来,它会回溯到运行然后停止。但是我想了解主服务器逻辑。 我应该怎么做才能步入org.apache.catalina.startup.Bootstrap 类?(或其他一些在主启动线程上运行的类)
【问题讨论】:
-
如何在调试模式下启动服务器?您使用 eclipse 的“服务器”,还是将其作为独立应用程序运行?
-
见stackoverflow.com/questions/975271/…。但是对于您的问题,您是否尝试过在 Bootstrap 类中放置一个断点,或者您想调试的任何地方?
-
在Eclipse中按Ctrl+Shift+T,写好类名并打开,像自己代码一样下断点。
标签: java eclipse debugging tomcat