Как проверить значение переменных «ThreadLocal» в Eclipse? - PullRequest
14 голосов
/ 22 ноября 2010

У меня есть пара ThreadLocal в моем веб-приложении.И при удаленной отладке веб-приложения я хочу видеть значение этих ThreadLocal переменных в Eclipse (так же, как Eclipse показывает другие переменные на вкладке переменных в перспективе Debug). Любая идея, как я могу просмотреть значение ThreadLocal переменных во время отладки в Eclipse?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 22 ноября 2010

В вашем коде вы должны поместить значения в локальную переменную, которую вы можете видеть. Вы должны быть в состоянии установить точку останова там, где используется ThreadLocal.

Проблема в том, что соединение отладчика находится в другом потоке, чем тот, который вас интересует. У Eclipse может быть решение для этого, но я не знаю, что это такое.

2 голосов
/ 07 апреля 2017

Когда вы достигнете любой точки останова, просто используйте представление Expressions, чтобы отобразить значение Thread.currentThread(), и вы сможете проверить каждое значение ThreadLocal.

enter image description here

0 голосов
/ 05 марта 2019

Если вы хотите больше подробностей, т.е. хотите видеть локальные переменные для всех потоков, может помочь следующий код:

    public static String printThreadLocal() {
        StringBuilder sb = new StringBuilder();
        try {
            Thread[] tarray = new Thread[Thread.activeCount()];
            Thread.enumerate(tarray);
            for (int i = 0; i < tarray.length; i++) {
                Field threadLocalField = Thread.class.getDeclaredField("threadLocals");
                threadLocalField.setAccessible(true);
                Object o1 = threadLocalField.get(tarray[i]); //Thread.currentThread());
                Field tableField = o1.getClass().getDeclaredField("table");
                tableField.setAccessible(true);
                Object[] o2 = (Object[]) tableField.get(o1);
                for (Object temp : o2) {
                    if (temp != null) {
                        Field valueField = temp.getClass().getDeclaredField("value");
                        valueField.setAccessible(true);
                        Object o3 = valueField.get(temp);
                        sb.append(o3.toString() + "\n");
                    }
                }
            }

        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }

Вы можете добавить MyClass.printThreadLocal() к Expressions.

...