• java 定位问题方法 (jdb 和 jstack)


     使用java 做开发,大部分的朋友都是利用DIE 来做debug 工作,因为这样可视化效果好。

    但是在真实的工作中,很多使用遇到问题,手头或者环境是不允许你利用DIE 来对源码做debug 工作,开发者只能够利用仅有的jdk 环境和shell 环境,对出现问题的程序进行debug。

    本篇文章主要是向大家介绍,如何利用jdk 自带的 jdb 和jstack 来定位问题。

    • jdb 

    首先jdb 是一款类似gdb 的工具,它可以帮助用户在运行程序时,直接打对应断点,然后进行debug 工作。

    jdb 和IDE debug 的区别在于,整个debug 过程都是命令行交互的。

    用户使用jdb 进行debug ,有两种方式

    1. 直接利用jdb 启动程序
    2. 在启动程序时,加入特殊参数,使得用户可以通过 jdb attach 进去

    我们先来看看直接使用jdb 如何debug 程序。

    jdb 运行程序,其实和java 直接运行程序差不多,但是有一些小细节需要大家注意的,就是jdb 不支持-cp 命令,也不支持以下方式添加classpath

    -Djava.ext.dirs="/root/monitor_collect/lib"

    在使用jdb 运行程序时,如果有以来jar 包,用户必须要使用 -classpath 参数,将相关的jar 全部填写进去,例如一个完整的启动命令

    jdb -Dlog4j.configuration="file:/root/monitor_collect/log4j.properties"  
    -classpath /root/monitor_collect/lib/args4j-2.33.jar:/root/monitor_collect/lib/sequoiadb-driver-3.0.jar:/root/monitor_collect/lib/slf4j-api-1.7.12.jar:/root/monitor_collect/lib/log4j-1.2.14.jar:/root/monitor_collect/SdbMonitor.jar  
    com.sequoiadb.monitor.MonitorAlarm

    进入jdb后,会显示以下信息

    Initializing jdb ...

    然后用户就可以开始debug 了,先打一个断点。

    打断点有两种方式

    1. 对某个类的方法打上断点
    2. 对某个类的行号打上断点

    如果是对某个类的方法打断点,命令是

    stop in com.sequoiadb.monitor.alarm.util.AlarmObject.analy_transaction

    如果是对某个类的行号打断点,命令是

    stop at com.sequoiadb.monitor.alarm.util.AlarmObject:944

    注意:类名一定要写全,包括package 名字也要写好。

    运行的命令为:run

    查看当前运行的堆栈信息为:where

    执行下一步为:next

    打印某个变量为:print

    进入该行的函数为:step

    从函数中跳出来为:step up

    让程序从断点中继续执行为:cont

    后面让我们再来看看,如果利用java 程序启动后,用户通过jdb 连接并且调试的。

    用户在执行java 程序时,需要添加以下额外的参数,suspend=y 表示不加载主类,只有用户通过 jdb connect 后,再加载主类。

    -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y

    例如一个完整的命令:

    java 
    -Dlog4j.configuration="file:/root/monitor_collect/log4j.properties"  
    -cp /root/monitor_collect/lib/args4j-2.33.jar:/root/monitor_collect/lib/sequoiadb-driver-3.0.jar:/root/monitor_collect/lib/slf4j-log4j12-1.7.25.jar:/root/monitor_collect/lib/slf4j-api-1.7.12.jar:/root/monitor_collect/lib/log4j-1.2.14.jar:/root/monitor_collect/SdbMonitor.jar  
    -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y 
    com.sequoiadb.monitor.MonitorAlarm

    用户执行该命令后,窗口会挂起,用户可以在另外一个窗口中,继续操作(支持远程连接),如果需要远程连接,添加hostname 参数即可,如果hostname 参数不填写,默认为本地

    jdb -connect com.sun.jdi.SocketAttach:port=8787,hostname=sdb1

    用户通过 jdb connect 到远程的jave 程序后,操作方式和直接使用 jdb 启动程序的方式一致。

    • jstack

    jstack 是jdk 又一个好用的debug 工具。它和jdb 不同,不是交互式地查看java 程序的相关调用和变量值,而是当用户的java 程序在运行过程中,突然出现 handle 的情况,而且该情况无法 100% 复现时,用户可以利用 jstack 工具将java 程序当前的堆栈信息全部打印出来。

    这样用户可以通过堆栈信息分析程序到底是 handle 在什么地方。

    jstack 打印java 程序当前的堆栈信息

    jstack -l PID > java.jstack.out

    参考博客:

    http://blog.csdn.net/arkblue/article/details/39718947

    https://www.ibm.com/developerworks/cn/java/joy-jdb/index.html

    介绍jave 程序在启动 jdwp 时,各种参数的含义:http://chainhou.iteye.com/blog/1837059

  • 相关阅读:
    一种针对SOA的消息类型架构
    许可方式 到底"非商业用途"意味着什么?
    Windows 7的CMD中 Telnet 无法执行的解决办法
    ASP.NET MVC 2.0 中文正式版发布
    什么是REST?
    架构、框架的区别
    Firefox 火狐下自动刷新的插件 ReloadEvery
    ASP.NET与JQUERY的AJAX文件上传 视频课件+源码Demo
    给吸烟的园友们:一个被烟草行业隐瞒了十年的秘密,烟真不是人吸的
    Echo Server,AsyncSocket,SocketAsyncEvent,SocketAsyncEventArgs,AsyncQueue
  • 原文地址:https://www.cnblogs.com/chenfool/p/5812646.html
Copyright © 2020-2023  润新知