异常时变量的转储状态

2022-09-04 04:01:19

我想知道是否有一种方法可以在出现异常时转储所有局部变量的状态,以便更好地了解导致异常的环境状态。下面的变量在运行时是未知的,我想找出集合中的值导致NPE的状态。idsToDump

例:

public static void main(String[] args) {
    HashMap<Integer, String> employees = new HashMap<Integer, String>();
    employees.put(1, "James");

    Integer[] idsToDump = new Integer[] { 1, 2, 3 };
    for (Integer employeeId : idsToDump) {
        String name = employees.get(employeeId).toLowerCase();
        System.out.println(name + " is employee number: " + employeeId);
    }

}

输出:

james is employee number: 1
Exception in thread "main" java.lang.NullPointerException

问:是否有一些 JVM 参数可以传递来转储有关局部变量当前状态的信息?即我们得到

java.lang.NullPointerException

和(这是我追求的部分)

values: employeeId=2

我希望能够在客户端站点上执行此操作,因此无法访问Eclipse或调试工具,仅查找JVM参数,也无法进行代码更改。我看过它们,但真的找不到任何东西。与此同时,我也会继续在那里搜索,;)


答案 1

我遇到了一个商业产品,它通过简单地使用启动 -agentlib JVM 代理参数来做到这一点。我还没有使用它,但打算尝试一下,因为它看起来很有前途。

https://www.takipi.com/product

有人有这个产品的经验吗?


答案 2

鉴于您的所有限制,除了jdb之外,我不能再推荐其他任何东西。解雇那个坏男孩,并开始逐行浏览客户端代码。我知道你说没有调试工具,但除非它们是JRE专用环境,否则您应该已经安装了jdb。