gpt4 book ai didi

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

使用idea开发工具调试代码的时候,如果是java的web项目,使用的是tomcat作为web容器,打断点debug调试跟踪,当跟踪到org.apache.catalina包下的时候,则无法进入,这是因为idea运行的tomcat是通过插件的方式集成的,tomcat里面的lib包不再项目的依赖路径中,所以不能跟踪进去 。

首先在自己项目中被tomcat回调的接口实现类中,标记一个断点信息,通过idea启动web项目,当出现如图所示的断点信息的时候,因为断点位置标记的是tomcat回调的接口类,所以按照调用堆栈网上则是tomcat内部代码,但此时双击org.apache.catalina包下面的类名,是没有任何反应的,因为我们还没有将tomcat对应的依赖文件添加到classpath下面 。

添加依赖 。

?
1
2
3
4
5
6
<dependency>
  <groupid>org.apache.tomcat</groupid>
  <artifactid>tomcat-catalina</artifactid>
  <version> 8.5 . 55 </version>
  <scope>provided</scope>
</dependency>

因为运行时使用的是tomcat的lib目录下面的jar文件,所以此处的scope使用provided方式 。

下面就可以进入到tomcat源码调试了 。

tomcat启动日志是怎么执行打出来的?

03-jun-2020 10:31:30.929 信息 [main] org.apache.catalina.startup.versionloggerlistener.log server.服务器版本: apache tomcat/8.5.55 03-jun-2020 10:31:30.938 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 服务器构建:    may 5 2020 22:10:54 utc 03-jun-2020 10:31:30.938 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 服务器版本号(:   8.5.55.0 03-jun-2020 10:31:30.938 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 操作系统名称:   windows 10 03-jun-2020 10:31:30.938 信息 [main] org.apache.catalina.startup.versionloggerlistener.log os.版本:      10.0 03-jun-2020 10:31:30.938 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 架构:       amd64 03-jun-2020 10:31:30.939 信息 [main] org.apache.catalina.startup.versionloggerlistener.log java 环境变量:   c:\program files\java\jdk1.8.0_212\jre 03-jun-2020 10:31:30.939 信息 [main] org.apache.catalina.startup.versionloggerlistener.log java虚拟机版本:  1.8.0_212-b10 03-jun-2020 10:31:30.939 信息 [main] org.apache.catalina.startup.versionloggerlistener.log jvm.供应商:    oracle corporation 03-jun-2020 10:31:30.939 信息 [main] org.apache.catalina.startup.versionloggerlistener.log catalina_base:   c:\users\administrator\.intellijidea2018.3\system\tomcat\unnamed_spring-shiro-training 03-jun-2020 10:31:30.939 信息 [main] org.apache.catalina.startup.versionloggerlistener.log catalina_home:   d:\tomcat8.5.55\apache-tomcat-8.5.55 。

通过定位到 versionloggerlistener 日志可以查看到 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private void log() {
  log.info(sm.getstring( "versionloggerlistener.serverinfo.server.version" ,
   serverinfo.getserverinfo()));
  log.info(sm.getstring( "versionloggerlistener.serverinfo.server.built" ,
   serverinfo.getserverbuilt()));
  log.info(sm.getstring( "versionloggerlistener.serverinfo.server.number" ,
   serverinfo.getservernumber()));
  log.info(sm.getstring( "versionloggerlistener.os.name" ,
   system.getproperty( "os.name" )));
  log.info(sm.getstring( "versionloggerlistener.os.version" ,
   system.getproperty( "os.version" )));
  log.info(sm.getstring( "versionloggerlistener.os.arch" ,
   system.getproperty( "os.arch" )));
  log.info(sm.getstring( "versionloggerlistener.java.home" ,
   system.getproperty( "java.home" )));
  log.info(sm.getstring( "versionloggerlistener.vm.version" ,
   system.getproperty( "java.runtime.version" )));
  log.info(sm.getstring( "versionloggerlistener.vm.vendor" ,
   system.getproperty( "java.vm.vendor" )));
  log.info(sm.getstring( "versionloggerlistener.catalina.base" ,
   system.getproperty( "catalina.base" )));
  log.info(sm.getstring( "versionloggerlistener.catalina.home" ,
   system.getproperty( "catalina.home" )));
 
 
  if (logargs) {
  list<string> args = managementfactory.getruntimemxbean().getinputarguments();
  for (string arg : args) {
   log.info(sm.getstring( "versionloggerlistener.arg" , arg));
  }
  }
 
 
  if (logenv) {
  sortedmap<string, string> sortedmap = new treemap<>(system.getenv());
  for (map.entry<string, string> e : sortedmap.entryset()) {
   log.info(sm.getstring( "versionloggerlistener.env" , e.getkey(), e.getvalue()));
  }
  }
 
 
  if (logprops) {
  sortedmap<string, string> sortedmap = new treemap<>();
  for (map.entry<object, object> e : system.getproperties().entryset()) {
   sortedmap.put(string.valueof(e.getkey()), string.valueof(e.getvalue()));
  }
  for (map.entry<string, string> e : sortedmap.entryset()) {
   log.info(sm.getstring( "versionloggerlistener.prop" , e.getkey(), e.getvalue()));
  }
  }
}

发现是通过键值对的方式获取的,再通过字符串全局搜索发现 。

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

但是匹配的是英文,那么中文是怎么打出来的呢?

最后通过调试发现找的是这个 。

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

类似上面的东西,调试的时候发现tocmat的东西启动还是相当多的 且看下面这个 。

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

idea tomcat启动后的数据 。

03-jun-2020 10:31:30.939 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-djava.util.logging.config.file=c:\users\administrator\.intellijidea2018.3\system\tomcat\unnamed_spring-shiro-training\conf\logging.properties 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-djava.util.logging.manager=org.apache.juli.classloaderlogmanager 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:52290,suspend=y,server=n 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-javaagent:c:\users\administrator\.intellijidea2018.3\system\captureagent\debugger-agent.jar 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dfile.encoding=utf-8 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dcom.sun.management.jmxremote= 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dcom.sun.management.jmxremote.port=1099 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dcom.sun.management.jmxremote.ssl=false 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dcom.sun.management.jmxremote.password.file=c:\users\administrator\.intellijidea2018.3\system\tomcat\unnamed_spring-shiro-training\jmxremote.password 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dcom.sun.management.jmxremote.access.file=c:\users\administrator\.intellijidea2018.3\system\tomcat\unnamed_spring-shiro-training\jmxremote.access 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-djava.rmi.server.hostname=127.0.0.1 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-djdk.tls.ephemeraldhkeysize=2048 03-jun-2020 10:31:30.940 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-djava.protocol.handler.pkgs=org.apache.catalina.webresources 03-jun-2020 10:31:30.941 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dignore.endorsed.dirs= 03-jun-2020 10:31:30.941 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dcatalina.base=c:\users\administrator\.intellijidea2018.3\system\tomcat\unnamed_spring-shiro-training 03-jun-2020 10:31:30.941 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-dcatalina.home=d:\tomcat8.5.55\apache-tomcat-8.5.55 03-jun-2020 10:31:30.941 信息 [main] org.apache.catalina.startup.versionloggerlistener.log 命令行参数:-djava.io.tmpdir=d:\tomcat8.5.55\apache-tomcat-8.5.55\temp 。

以上还只是基本的环境配置等启动 然后是准备链接到tomcat服务 。

03-jun-2020 10:31:30.941 信息 [main] org.apache.catalina.core.aprlifecyclelistener.lifecycleevent 使用apr版本[1.7.0]加载了基于apr的apache tomcat本机库[1.2.24]。 03-jun-2020 10:31:30.941 信息 [main] org.apache.catalina.core.aprlifecyclelistener.lifecycleevent apr功能:ipv6[true]、sendfile[true]、accept filters[false]、random[true]。 03-jun-2020 10:31:30.941 信息 [main] org.apache.catalina.core.aprlifecyclelistener.lifecycleevent apr/openssl配置:useaprconnector[false],useopenssl[true] 03-jun-2020 10:31:30.944 信息 [main] org.apache.catalina.core.aprlifecyclelistener.initializessl openssl成功初始化 [openssl 1.1.1g  21 apr 2020] 03-jun-2020 10:31:31.032 信息 [main] org.apache.coyote.abstractprotocol.init 初始化协议处理器 ["http-nio-8080"] 03-jun-2020 10:31:31.046 信息 [main] org.apache.tomcat.util.net.nioselectorpool.getsharedselector using a shared selector for servlet write/read 03-jun-2020 10:31:31.055 信息 [main] org.apache.catalina.startup.catalina.load initialization processed in 175489 ms 03-jun-2020 10:31:31.080 信息 [main] org.apache.catalina.core.standardservice.startinternal 正在启动服务[catalina] 03-jun-2020 10:31:31.080 信息 [main] org.apache.catalina.core.standardengine.startinternal starting servlet engine: apache tomcat/8.5.55 03-jun-2020 10:31:31.089 信息 [main] org.apache.coyote.abstractprotocol.start 开始协议处理句柄["http-nio-8080"] 03-jun-2020 10:31:31.102 信息 [main] org.apache.catalina.startup.catalina.start server startup in 47 ms 。

tomat启动主要是在catalina中 。

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法
Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

然后是 。

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

启动 。

?
1
2
3
4
5
6
7
8
9
/**
* await and shutdown.
*/
public void await() {
 
  getserver().await();
 
 
}

其实tomcat启动本质上就是socket的服务器罢了 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
@override
public void await() {
  // negative values - don't wait on port - tomcat is embedded or we just don't like ports
  if (port == - 2 ) {
  // undocumented yet - for embedding apps that are around, alive.
  return ;
  }
  if (port==- 1 ) {
  try {
   awaitthread = thread.currentthread();
   while (!stopawait) {
   try {
    thread.sleep( 10000 );
   } catch ( interruptedexception ex ) {
    // continue and check the flag
   }
   }
  } finally {
   awaitthread = null ;
  }
  return ;
  }
 
 
  // set up a server socket to wait on
  try {
  awaitsocket = new serversocket(port, 1 ,
   inetaddress.getbyname(address));
  } catch (ioexception e) {
  log.error( "standardserver.await: create[" + address
     + ":" + port
     + "]: " , e);
  return ;
  }
 
 
  try {
  awaitthread = thread.currentthread();
 
 
  // loop waiting for a connection and a valid command
  while (!stopawait) {
   serversocket serversocket = awaitsocket;
   if (serversocket == null ) {
   break ;
   }
 
 
   // wait for the next connection
   socket socket = null ;
   stringbuilder command = new stringbuilder();
   try {
   inputstream stream;
   long acceptstarttime = system.currenttimemillis();
   try {
    socket = serversocket.accept(); //一旦accecpt后面就开始执行了
    socket.setsotimeout( 10 * 1000 ); // ten seconds
    stream = socket.getinputstream();
   } catch (sockettimeoutexception ste) {
    // this should never happen but bug 56684 suggests that
    // it does.
    log.warn(sm.getstring( "standardserver.accept.timeout" ,
     long .valueof(system.currenttimemillis() - acceptstarttime)), ste);
    continue ;
   } catch (accesscontrolexception ace) {
    log.warn(sm.getstring( "standardserver.accept.security" ), ace);
    continue ;
   } catch (ioexception e) {
    if (stopawait) {
    // wait was aborted with socket.close()
    break ;
    }
    log.error(sm.getstring( "standardserver.accept.error" ), e);
    break ;
   }
 
 
   // read a set of characters from the socket
   int expected = 1024 ; // cut off to avoid dos attack
   while (expected < shutdown.length()) {
    if (random == null )
    random = new random();
    expected += (random.nextint() % 1024 );
   }
   while (expected > 0 ) {
    int ch = - 1 ;
    try {
    ch = stream.read();
    } catch (ioexception e) {
    log.warn(sm.getstring( "standardserver.accept.readerror" ), e);
    ch = - 1 ;
    }
    // control character or eof (-1) terminates loop
    if (ch < 32 || ch == 127 ) {
    break ;
    }
    command.append(( char ) ch);
    expected--;
   }
   } finally {
   // close the socket now that we are done with it
   try {
    if (socket != null ) {
    socket.close();
    }
   } catch (ioexception e) {
    // ignore
   }
   }
 
 
   // match against our command string
   boolean match = command.tostring().equals(shutdown);
   if (match) {
   log.info(sm.getstring( "standardserver.shutdownviaport" ));
   break ;
   } else
   log.warn(sm.getstring( "standardserver.invalidshutdowncommand" , command.tostring()));
  }
  } finally {
  serversocket serversocket = awaitsocket;
  awaitthread = null ;
  awaitsocket = null ;
 
 
  // close the server socket and return
  if (serversocket != null ) {
   try {
   serversocket.close();
   } catch (ioexception e) {
   // ignore
   }
  }
  }
}

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

tomcat容器启动之后,下面就是springmvc模块的内容了 。

Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法
Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法

到此这篇关于idea中tomcat启动源码调试进入到tomcat内部进行调试的方法的文章就介绍到这了,更多相关idea中tocmat启动源码调试内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/xiaorui51/article/details/108024701 。

最后此篇关于Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法的文章就讲到这里了,如果你想了解更多关于Idea中tomcat启动源码调试进入到tomcat内部进行调试的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com