zoukankan      html  css  js  c++  java
  • jdb--gdb---java 远程调试(java application与web application)

    命令比较
        gdb              jdb
        bt             where
        del           clear
        stop         break
        finish      step up
    更多
    http://www.fas.harvard.edu/~cscie119/resources/jdb_reference.pdf

    5)如果想看但 source code
    用命令
    jdb -classpath robocode/libs/robocode.jar:bin -sourcepath src
    内部设置 sourcepath 用 "use"
     
    一个是直接调用jdb Classname的话调试时没法列出源程序代码,至少在我这里是这样,要用
    jdb -classpath . Classname
    ── lib
    │   ├── jars
    │   │   ├── lwjgl.jar
    │   │   ├── lwjgl_util.jar
    │   │   └── slick-util.jar
    │   └── natives-linux
    │       ├── libjinput-linux64.so
    │       ├── libjinput-linux.so
    │       ├── liblwjgl64.so
    │       ├── liblwjgl.so
    │       ├── libopenal64.so
    │       └── libopenal.so
    ├── LICENCE
    1. Specify the path to lwjgl.jar in the classpath.
    2. Add -Djava.library.path option for inserting the lwjgl natives.
    3. Use the full name of the class using also the package. Ex. com.ionsoft.engine.Engine
    1. # JVM server
    2. java -classpath ./build/classes:./lib/jars/lwjgl.jar -Djava.library.path=./lib/natives-linux -agentlib:jdwp=transport=dt_socket,address=localhost:8888,server=y,suspend=ycom.ionsoft.engine.Engine
    3.  
    4. # JDB client
    5. jdb -sourcepath ./src -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8888

    如摘要中所述,在联调时经常性的需要将程序部署到测试机器上,此时要调试显得很不方便。以前的做法都是在程序中打印信息来进行追踪,但是这种方法很有局限性,因为往往无法一次就定位到有问题的地方,需要不断的修改程序打印的语句,不断的重启应用,这需要花费大量的时间和精力。因此,采用远程调试会是一种好的解决方式。下面将会对java application和web application两种入手进行说明。

    一、Java Application的远程调试

    1、准备要调试的server端环境

    首先准备一段小的代码,并且在main方法中调用,我这边写了一段没有任何意义的代码,仅仅是为了演示需要,如下:

    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
    package com.zzq.test;
     
    /**
     * @author zhengzhq E-mail:zzq0324@qq.com
     * @version 创建时间:2015-9-4 下午02:59:35
     */
    public class RemoteDebug {
     
        public static void checkName(String name) {
            if ("name1".equals(name)) {
                System.out.println("this is name1");
            else if ("name2".equals(name)) {
                System.out.println("this is name2");
            else {
                System.out.println("unknow name " + name + "!!!");
            }
        }
     
        public static void main(String[] args) {
            if (args.length > 0) {
                checkName(args[0]);
            else {
                checkName("unknow");
            }
        }
     
    }

    如果运行中有传递值,将第一个值作为name传递给方法,很简单的代码。通过开发工具export-runnable jar,指定好执行的Main class->finish,jar包生成完成,我这边导出为debug.jar。此时在命令行执行java -jar debug.jar,出现如下图:

    在java -jar中加入其他的启动信息,则程序会开启远程调试模式,并处于阻塞状态,如下:

    1
    java -Xms700m -Xmx700m -Xdebug -server -Xrunjdwp:transport=dt_socket,server=y,address=12345 -jar debug.jar name1

    其中address为指定的端口。

    2、指定调试的client端环境

    调试的代码由于本地环境拥有,所以直接在IDE中右击->debug As->Debug Configurations,弹出如下窗口,在Remote Application下可以配置要远程调试的项目:

    配置完成后,点击弹出窗下的debug,则程序自动会与调试的server端连接上。如果server端没启动,则意味着端口没监听,会报Connection refused;否则程序根据设置的断点进入执行。

    二、Web Application

    将应用打成war包放到tomcat/webapps目录下,然后设置tomcat/conf/startup.sh,在前面加入如下的脚本

    1
    SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=12345

    然后启动即可,启动过程中会有打印一行关于远程调试监听:

    客户端的配置与Java Application一致,运行即可进行调试i

  • 相关阅读:
    2018年最新整理ios APP审核被拒的常见原因
    在线一键生成安卓证书keystore文件
    iOS证书的类型功能和申请介绍
    【2018】ios app真机调试到上架App Store完整教程
    预防SQL注入
    Python模块——HashLib(摘要算法)与base64
    Python加密与解密
    PostgreSQL常用命令
    二级子目录(后台目录)设置二级域名
    积累
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/5098120.html
Copyright © 2011-2022 走看看