Tomcat使用终端debug 调试代码

举报
lu_zhishen 发表于 2020/12/02 22:13:23 2020/12/02
【摘要】 有些时候 在本地跑的程序正常,但是放到测试环境后就不正常了,这时候我们的首选方法是打个断点跑跑,无奈测试环境没有装eclipse。现在尝试使用另一种断点的调试方法:1.使用ps -ef | grep java  命令查找tomcat进程;1.先用kill -9 pid 杀死tomcat 2.启动tomcat 使用命令 ./catalina debug>run等待启动完毕设定断点命令stop ...
有些时候 在本地跑的程序正常,但是放到测试环境后就不正常了,这时候我们的首选方法是打个断点跑跑,无奈测试环境没有装eclipse。现在尝试使用另一种断点的调试方法:
1.使用ps -ef | grep java  命令查找tomcat进程;
1.先用kill -9 pid 杀死tomcat 
2.启动tomcat 使用命令 ./catalina debug
>run
等待启动完毕
设定断点命令
stop in <类 ID>.<方法>[(参数类型,...)] - 在方法中设置断点 使用 in 类名和方法名用 . 分割
stop at <类 ID>:<行>        - 在行中设置断点 使用的是at 类名与行号用 : 分割
例如:
>stop in org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil.findByPeriodAndPid()  --给方法添加断点
>stop at org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil:402 ----给该类的402添加断点
查看断点的命令:
>clear
显示的信息如下:
断点集:
断点 org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil:402
去掉断点 和添加断点类似 
命令:
clear <类 ID>.<方法>[(参数类型,...)]  - 清除方法中的断点
clear <类 ID>:<行>    - 清除行中的断点

例如:
> clear org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil.findByPeriodAndPid  --清除方法断点
已删除: 断点 org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil.findByPeriodAndPid
> clear org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil:402   ---清除行断点
已删除: 断点 org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil:402

查看类相关信息
classes                     - 列出当前已知的类
class <类 ID>               - 显示已命名的类的详细信息
methods <类 ID>             - 列出类的方法
fields <类 ID>              - 列出类的字段

当我们设置好断点之后就是调试步骤了:
设置断点
> stop at org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil:402
设置 断点 org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil:402
点击前台页面 后台自动捕获断点
断点命中: "thread=http-8080-2", org.scf.portlet.projectcostmanagenew.util.DaysCostDetailFinderUtil.findByPeriodAndPid(), line=402 bci=0
前台进入等待
取消本次断点调试命令
>cont
这个命令也许要输入两次(具体原因未知)
>step                        - 执行当前行 (如果是调用的外部方法 会进入到方法内部 跳出使用step up命令)
>step up                     - 执行到当前方法返回到其调用程序(当使用step进入的时候会 跳出到断点执行的行)
>stepi                       - 执行当前指令(执行当前行,一次次的执行)
>next                        - 跳过一行(跨过调用)(执行下一行)
>cont                        - 从断点处继续执行

查看变量的值(这个是我们跟踪的主要目的);
我们查看当前类都包含那些变量使用的命令是:
fields <类 ID>              - 列出类的字段
查找某个方法含有的局部变量使用:
locals                      - 输出当前堆栈帧中的所有局部变量
print <表达式>              - 输出表达式的值
dump <表达式>               - 输出所有对象信息
eval <表达式>               - 输出表达式的值(与 print 相同)
set <lvalue> = <表达式>     - 为字段/变量/数组元素指定新值
查找当前方法含有的变量
http-8080-6[1] locals 
方法参数:
pid = ""
period = "2012-01"
contractId = ""
projectName = ""
proDirectorName = ""
PM = ""
stuff = ""
grade = "ALL"
jobDis = ""
reportCostcenter = ""
proSupportCostcenter = ""
proSupportCostcenters = "ALL"
start = 0
delta = 10
打印某个变量的值
http-8080-6[1] print start
start = 0
给start赋值为 10
http-8080-6[1] set start=10

以上是断点调试的大体步骤,感觉大约都能实现eclipse的调试功能;
catalina.out debug 还有很多的用法。可以使用help命令 具体查看;
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。