使用JDB指令模拟Eclipse调试java程序.

来源:互联网 发布:打电话变声软件男变女 编辑:程序博客网 时间:2024/06/06 17:24

使用JDB指令模拟Eclipse调试java程序.

最近一段时间在研究JVM虚拟机, 大致明白了其运作过程。研究完毕后, 向上走, 便在想是如何实现程序调试功能的,刚好查看到JDB工具.

JDB(Java Debugger), 主要用来协助使用者查找并修复Java程序中的bug, 使用者可以通过它来设置程序断点, 单步, 启动, 停止, 查看变量值.

操作过程

本文用到的程序:

// Robot.java// jony deng// den.mingxing@163.com// 2017/06/28import java.util.Scanner;public class Robot{    // 大笑.    public native void Laugh();    // 改变背景.    public native void WallPaper();    // 打印文字.    public native void Hello();    // 语音识别.    public native void Listen();    int mMemCnt = 0;    static    {        System.loadLibrary("Robot");    }    public static void main(String[] args)    {        Robot rbt = new Robot();        Scanner sc = new Scanner(System.in);        int cmdCnt = 0;        while(true)        {            cmdCnt++;            rbt.mMemCnt++;            System.out.println("");            System.out.println("Please select your opperations:(" + Integer.toString(cmdCnt) + ")");            System.out.println("=========================================");            System.out.println("H/h:    Hello world.");            System.out.println("L/l:    Listen.");            System.out.println("S/s:    Speak.");            System.out.println("W/w:    Change the wallpaper.");            System.out.println("E/e:    Exit demo.");            String text = sc.nextLine();            if(text.equals("S") || text.equals("s"))            {                System.out.println("Speak...");                rbt.Laugh();            }            else if(text.equals("W") || text.equals("w"))            {                System.out.println("Change the wallpaper...");                rbt.WallPaper();            }            else if(text.equals("H") || text.equals("h"))            {                rbt.Hello();            }            else if(text.equals("E") || text.equals("e"))             {                System.out.println("App exit");                break;            }            else if(text.equals("L") || text.equals("l"))            {                rbt.Listen();            }            else            {                System.out.println("***" + text + "***");            }            System.out.println("");         }    }}
1.编译程序
javac -g Robot.java
注意编译的时候,一定要指定”-g”选项。在class文件中生成所有调试信息, 后续查看变量数据时, 需要用到这些调试信息.
2.启动jdb
jdb
使用此指令后, 将进入到启动jdb.
3.设定断点
stop at Robot:30
在文件的第30行设置断点, 指令原型是: stop at class_id:line_num, 表示在某一行设置断点. 结果如下:
这里写图片描述
4.启动程序
run Robot
启动Robot类. 结果如下:
这里写图片描述
5.查看某个函数类的局部变量
locals
查看局部变量的值, 从下图可知本地变量有rbt, sc. 此时还没有显示cmdCnt的数值. 当运行到36行后, 便显示了cmdCnt的值了.
这里写图片描述

这里写图片描述

5.单独查看某个成员变量的数值.
print rbt.mMemCnt
查看rbt实例的成员变量的值, 如果要查看某个Class的静态成员变量, 也是使用此指令.
6.单独查看某个局部变量或.
print cmdCnt
查看局部变量cmdCnt的值.
其他指令, 请读者参考help内的指令集. 基本上可以根据jdb实现
1). 打断点、清除断点.
2). step into, step over, step out.
3). 查看和修改类成员变量、局部变量的值.
4). 终止线程.