В отсутствие более полного сообщения об ошибке от собственной обертки, используйте truss
, чтобы определить системный вызов низкого уровня, который завершается неудачно (наиболее вероятно, с EACCES
), при этом работая какnon- root
user:
truss -l -d -f -vall -wall -o truss.out java ... TestOrAppClass
То, что вы ожидаете увидеть в truss.out
после того, как приложение Java сгенерирует исключение и завершится (или прекратит работу) - обратите внимание на чередующиеся пробелы в I O E x c e p t i o n
:
...
...
...
...
23515/1: 0.2912 some_system_call(params) Err#13 EACCES [ALL]
...
23515/1: 0.2923 write(2, 0x08044F84, 39) = 39
23515/1: j a v a . i o . I O E x c e p t i o n : P e r m i s s i o n
23515/1: d e n i e d
...
...
...
...
Если рассматриваемое приложение слишком сложное и генерирует слишком много выходных данных (или иным образом сложно вызвать из командной строки), то напишите и скомпилируйте небольшой тестовый класс, который воспроизводит проблему, вызывая java.nio.channels.Selector.open()
напрямую.
Если вы не можете / не можете написать простой тестовый класс, помните, что вы всегда можете использовать дополнительный вывод, зарегистрированный с помощью опции -wall
, для корреляции времени (и потока / LWP), в котороераспечатка трассировки стека была произведена с фактическим системным вызовом, который должен был произойти незадолго до этого.
В приведенном выше примере truss.out
,23515
- это идентификатор процесса, /1
- это идентификатор LWP (удваивается как идентификатор «нити», если JVM использует собственные потоки, что почти наверняка происходит в Solaris), 0.2912
- метка времени (в секундах с момента java
).запуск процесса / трассировки), и some_system_call
сбой при EACCES
является вызовом интереса.
Какую версию JDK вы используете?