java.lang.InternalError: не удается подключиться к оконному серверу X11 для сеанса профилирования JVisualVM

У меня есть виртуальная машина сервера Ubuntu (myapp01), и на ней развернуто приложение Java. Приложение ведет себя шатко, и я хотел бы профилировать его с помощью JVisualVM. Для этого мне нужно установить X-Windows на моем хосте с Windows 7, а затем заставить виртуальную машину Ubuntu экспортировать свое соединение X11 на мой хост, когда я скажу ей запустить JVisualVM на виртуальной машине.

Итак, я начал с загрузки XMing здесь:

http://sourceforge.net/projects/xming/files/Xming/6.9.0.31/Xming-6-9-0-31-setup.exe/download

Я использовал все параметры установки по умолчанию/рекомендуемые, включая использование обычного сеанса PuTTy и разрешение общедоступного и частного доступа к сети. После установки XMing я запустил его и убедился, что он работает на моем хосте Windows. Затем я открыл Cygwin и подключился к серверу Ubuntu по SSH:

$ ssh myuser@myapp01
myuser@myapp01's password:
Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.5.0-23-generic x86_64)

* Documentation:  https://help.ubuntu.com/

System information as of Tue Jun 10 21:26:15 EDT 2014

System load:  0.0                Processes:           82
Usage of /:   22.5% of 11.81GB   Users logged in:     0
Memory usage: 30%                IP address for eth0: 10.10.41.108
Swap usage:   0%

    Graph this data and manage this system at:
    https://landscape.canonical.com/

38 packages can be updated.
30 updates are security updates.

Last login: Tue Jun 10 15:03:35 2014 from 10.10.101.96

Затем я экспортирую изображение в то, что выглядит как IP-адрес моего хоста:

myuser@myapp01:~$ export DISPLAY=10.10.101.96

Затем я пытаюсь запустить JVisualVM:

myuser@myapp01:~$ cd $JAVA_HOME
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64$ ls
bin  COPYRIGHT  db  include  jre  lib  LICENSE  man  README.html  release  src.zip  THIRDPARTYLICENSEREADME-JAVAFX.txt  THIRDPARTYLICENSEREADME.txt
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64$ cd bin/
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64/bin$ ./jvisualvm
Error: Can't connect to X11 window server using '10.10.101.96' as the value of the DISPLAY variable.
See the /home/myuser/.visualvm/7u14/var/log/messages.log for details.
myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64/bin$ vim /home/myuser/.visualvm/7u14/var/log/messages.log

Внутри /home/myuser/.visualvm/7u14/var/log/messages.log:

java.lang.InternalError: Can't connect to X11 window server using '10.10.101.96' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:110)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81)
    at org.netbeans.core.startup.Main.start(Main.java:200)
    at org.netbeans.core.startup.TopThreadGroup.run(TopThreadGroup.java:84)
    at java.lang.Thread.run(Thread.java:745)

Идеи? Я подключен к VPN, это может на что-то повлиять? У меня неправильно настроен XMing? Моя команда export DISPLAY неверна?


person IAmYourFaja    schedule 11.06.2014    source источник
comment
Почему отрицательные и близкие голоса без каких-либо объяснений? Этот сайт предназначен для того, чтобы задавать вопросы по программированию. Команда export DISPLAY — это оператор, интерпретируемый оболочкой, следовательно, это часть скрипта. Скрипт это код. Если мой export неверен, как я считаю, этот вопрос касается кода.   -  person IAmYourFaja    schedule 11.06.2014
comment
И если другой сайт SE больше подходит для этого вопроса, вместо того, чтобы отрицать его, просто переместите его!   -  person IAmYourFaja    schedule 11.06.2014
comment
У вас может быть какой-то код для отладки, но проблема не в вашем коде. Это ваш стандартный вопрос о том, как не знать, как запуститьXoverssh. Для таких вопросов есть superuser.stackexchange.com, askubuntu.stackexchange.com и unix.stackexchange.com. Все спрашивали и отвечали около миллиона раз, но вот снова: (1) включить пересылку X в ssh; (1) не устанавливайте DISPLAY, он уже должен быть установлен для вас, если вы сделали (1).   -  person n. 1.8e9-where's-my-share m.    schedule 12.06.2014
comment
Спасибо @n.m. (+1) - Однако я запутался, вы говорите, что мне нужно сначала включить пересылку X в SSH или сначала отключить отображение (в вашем комментарии выше есть 2 (1) инструкции)? Спасибо за любую помощь в разъяснении последовательности здесь!   -  person IAmYourFaja    schedule 13.06.2014
comment
Опечатка, да. не устанавливайте ДИСПЛЕЙ должен быть (2). Вы не сбрасываете DISPLAY, вы подключаетесь по ssh и проверяете, установлен ли он (что-то вроде localhost:10.0).   -  person n. 1.8e9-where's-my-share m.    schedule 13.06.2014
comment
И в заключение: вы проверяете, что X11Forwarding yes отображается без комментариев в вашей конфигурации sshd, если нет, то раскомментируйте/добавьте его, перезапустите sshd, затем ssh -Y на свой хост.   -  person n. 1.8e9-where's-my-share m.    schedule 13.06.2014
comment
У вас установлен JDK на вашем компьютере с Windows7? Если да, JVisualVM из Windows может легко контролировать удаленный хост. Если нет, попробуйте ssh -y ... см. man ssh (сторона unix) для получения более подробной информации.   -  person Serge Ballesta    schedule 13.06.2014
comment
Спасибо @SergeBallesta (+1), если это правда, что JVisualVM позволяет профилировать удаленный хост, можете ли вы дать мне ответ по настройке? Допустим, моя виртуальная машина известна в сети как myapp01. Мысли?   -  person IAmYourFaja    schedule 13.06.2014
comment
Обычно DISPLAY будет иметь IP-адрес: отображаемый номер. Вы пропустили: 0 (или какое-то число) в вашем экспортном DISPLAY?   -  person Jayan    schedule 17.06.2014
comment
Серж прав, см. также: stackoverflow.com/questions/6347261/   -  person surfealokesea    schedule 18.06.2014


Ответы (3)


В целях безопасности X-серверы обычно не принимают прямые TCP-соединения с других хостов. В противном случае люди могли бы подключить кейлоггеры к вашему X-серверу, и ваши нажатия клавиш будут передаваться по сети в незашифрованном виде, позволяя людям записывать пароли, просто находясь в той же локальной сети.

Но SSH обеспечивает безопасный способ пересылки трафика X11 через сеанс SSH с использованием параметров -X или -Y.

На компьютере с Windows убедитесь, что $DISPLAY настроен правильно, попробовав открыть xterm из командной строки. $DISPLAY, вероятно, будет установлено на :0, что означает localhost:0. Существуют также дополнительные маркеры, используемые для аутентификации подключений к X-серверу, которые хранятся в ~/.Xauthority, которые вы можете просмотреть с помощью xauth list.

Теперь запустите ssh -Y 10.10.101.96. Если вы получаете сообщение вроде X11 forwarding request failed on channel 0, запустите вместо него ssh -v -Y 10.10.101.96, чтобы получить отладочные сообщения. Если удаленная машина является сервером, причина, вероятно, будет заключаться в том, что xauth не установлен. В CentOS это xorg-x11-xauth RPM.

На удаленной машине, если все прошло хорошо, то $DISPLAY на удаленной машине теперь будет настроен на отображение прокси, настроенное SSH:

$ echo $DISPLAY
localhost:10.0

В этот момент вы можете запустить команду типа xterm на удаленной машине, и окно появится на вашем локальном дисплее.

Хотя на удаленной машине нет запущенного X-сервера, вам все равно может понадобиться установить кучу библиотек X11 для Java, чтобы иметь возможность общаться с вашим локальным X-сервером…

person andrewdotn    schedule 19.06.2014

Если JDK установлен на хосте Windows, нет необходимости использовать JVisualVM с хоста Unix через XWindow и ssh. Это совершенно правильное решение, но оно может быть сложным, если вы не привыкли к ssh и XWindow DISPLAY, не говоря уже об установке cygwin или XMing...

Самое простое решение в этом случае использования:

  • запустите jstatd на хосте Linux (желательно с теми же учетными данными приложения для отладки)
  • запустите jvisualvm на хосте Windows и попросите его подключиться к хосту Linux

(см. документы о jvisualvm и jstatd для получения дополнительной информации)

person Serge Ballesta    schedule 13.06.2014

Я решил аналогичную проблему. В моем случае в файле /etc/hosts был указан неверный IP-адрес для имени хоста сервера, на котором работает sshd.

К счастью, приложение Java дало мне более подробный вывод, в то время как другие приложения просто терпят неудачу с сообщением Failed to open display.

person user3132194    schedule 23.04.2015