#DebugVar

# 描述

DebugVar是调试变量监控类工具函数,核心作用是精准输出或监控指定变量的关键信息,它能主动捕获变量的名称、当前值、数据类型、内存地址(可选)等信息,并以易读的格式输出到调试控制台、日志文件或调试器面板,是开发者快速定位变量异常(如值不符合预期、类型错误)的常用工具。

# 方法

描述变量信息的DebugVar接口有如下方法:

方法 返回类型 备注
getDataType() int 获取变量类型。
getBlockNo() int 获取变量所在层级。
getName() String 获取变量名称。
isGlobal() Boolean 获取变量是否全局变量。
getVar Object 获取变量值。

# 示例

package quickstart;

import com.yashandb.jdbc.DebugVar;
import com.yashandb.jdbc.DebugFrame;
import com.yashandb.jdbc.YasDebugCallableStatement;
import com.yashandb.jdbc.Debugger;
import com.yashandb.jdbc.YasConnection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;


 // YashanDB 存储过程调试示例
public class DebugVarCompleteExample {

    public static Connection getConnection() throws SQLException, ClassNotFoundException {
        String url = "jdbc:yasdb://192.168.1.2:1688/yasdb";
        String user = "username";
        String password = "passwd";
        Class.forName("com.yashandb.jdbc.Driver");
        return DriverManager.getConnection(url, user, password);
    }

     // 调试存储过程示例
    public void debugProcedure(Connection conn, String procName) throws SQLException {
        // 通过Connection创建调试语句
        YasDebugCallableStatement debugger = ((YasConnection) conn).createDebugStatement("{call " + procName + "(?, ?, ?)}");

        try {
            // 设置输入参数
            debugger.setDouble(2, 50000.0);
            debugger.registerOutParameter(3, java.sql.Types.DOUBLE);

            // 启动调试模式
            debugger.pdbgStart();

            if (!debugger.isDebugOn()) {
                System.out.println("Debug mode failed to start");
                return;
            }

            // 分析所有变量
            analyzeAllVariables(debugger);

            // 查看调用栈帧
            viewCallStack(debugger);

            // 单步执行示例
            stepThrough(debugger, 5);

        } finally {
            // 终止调试
            if (debugger.isDebugOn()) {
                debugger.pdbgAbort();
            }
            debugger.close();
        }
    }

    // 分析所有变量
    private void analyzeAllVariables(YasDebugCallableStatement debugger) throws SQLException {
        List<DebugVar> allVars = debugger.pdbgShowFrameVariables();

        System.out.println("=== 变量分析报告 ===");
        System.out.println("总变量数: " + allVars.size());

        for (DebugVar var : allVars) {
            // 获取变量名
            String varName = var.getName();
            // 获取变量值 - 使用getVar()而不是getValue()
            Object value = var.getVar();
            // 获取数据类型 - 返回int类型码
            int dataType = var.getDataType();
            // 获取块号
            int blockNo = var.getBlockNo();
            // 是否全局变量
            Boolean isGlobal = var.isGlobal();

            System.out.println("\n变量名: " + varName);
            System.out.println("  值: " + value);
            System.out.println("  类型代码: " + dataType + " (" + getTypeName(dataType) + ")");
            System.out.println("  块号: " + blockNo);
            System.out.println("  全局: " + (isGlobal != null && isGlobal ? "是" : "否"));
        }
    }
    
    private void viewCallStack(YasDebugCallableStatement debugger) throws SQLException {
        List<DebugFrame> frames = debugger.pdbgShowFrames();

        System.out.println("\n=== 调用栈帧 ===");
        System.out.println("栈帧数量: " + frames.size());

        for (int i = 0; i < frames.size(); i++) {
            DebugFrame frame = frames.get(i);
            System.out.println("\n帧 #" + i);
            System.out.println("  类信息: " + frame.getClassInfo());
            System.out.println("  方法信息: " + frame.getMethodInfo());
            System.out.println("  行号: " + frame.getLineNum());
        }
    }

    private void stepThrough(YasDebugCallableStatement debugger, int stepCount) throws SQLException {
        System.out.println("\n=== 单步执行 ===");

        for (int i = 0; i < stepCount && debugger.isDebugOn(); i++) {
            // 获取当前位置
            long objectId = debugger.getRunObjectId();
            int subprogramId = debugger.getRunSubprogramId();
            int lineNum = debugger.getRunLineNum();

            System.out.println("步进 " + (i + 1) + ": 对象=" + objectId + ", 子程序=" + subprogramId + ", 行号=" + lineNum);

            // 单步执行 - 使用pdbgStepNext
            debugger.pdbgStepNext();

            // 在每步后获取变量
            List<DebugVar> vars = debugger.pdbgShowFrameVariables();
            System.out.println("  当前变量数: " + vars.size());
        }
    }
    

    public void addBreakpointExample(Connection conn, String procName, int lineNum) throws SQLException {
        YasDebugCallableStatement debugger = ((YasConnection) conn).createDebugStatement("{call " + procName + "()}");

        try {
            // 添加断点
            debugger.pdbgAddBreakpoint(1000L, 1, lineNum);

            // 查看所有断点
            System.out.println("=== 断点列表 ===");
            List<?> breakpoints = debugger.pdbgShowBreakpoints();
            System.out.println("断点数量: " + breakpoints.size());

        } finally {
            if (debugger.isDebugOn()) {
                debugger.pdbgAbort();
            }
            debugger.close();
        }
    }

    public void simpleDebugFlow(Connection conn) throws SQLException {
        // 创建调试语句
        YasDebugCallableStatement debugger = ((YasConnection) conn).createDebugStatement("SELECT * FROM DUAL");

        try {
            // 启动调试
            debugger.pdbgStart();

            if (debugger.isDebugOn()) {
                System.out.println("调试已启动");

                // 获取变量
                List<DebugVar> vars = debugger.pdbgShowFrameVariables();
                System.out.println("变量数量: " + vars.size());

                // 继续执行
                debugger.pdbgContinue();

                // 获取调用栈
                List<DebugFrame> frames = debugger.pdbgShowFrames();
                System.out.println("栈帧数量: " + frames.size());
            }

        } finally {
            // 终止调试
            debugger.pdbgAbort();
            debugger.close();
        }
    }

    private String getTypeName(int typeCode) {
        // java.sql.Types中的常见类型
        switch (typeCode) {
            case java.sql.Types.CHAR:
            case java.sql.Types.VARCHAR:
                return "VARCHAR";
            case java.sql.Types.NUMERIC:
            case java.sql.Types.DECIMAL:
                return "NUMBER";
            case java.sql.Types.INTEGER:
                return "INTEGER";
            case java.sql.Types.FLOAT:
            case java.sql.Types.REAL:
                return "FLOAT";
            case java.sql.Types.DOUBLE:
                return "DOUBLE";
            case java.sql.Types.DATE:
            case java.sql.Types.TIME:
            case java.sql.Types.TIMESTAMP:
                return "DATE/TIME";
            case java.sql.Types.BLOB:
                return "BLOB";
            case java.sql.Types.CLOB:
                return "CLOB";
            default:
                return "UNKNOWN(" + typeCode + ")";
        }
    }

    public static void main(String[] args) {
        try (Connection conn = getConnection()) {
            DebugVarCompleteExample example = new DebugVarCompleteExample();

            System.out.println("=== 示例1: 简单调试流程 ===");
            System.out.println("连接成功!");

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

正常情况下,程序输出如下:


=== 示例1:简单调试流程 ===
连接成功!

pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流