Непонятный сбой вызова внешнего исполняемого файла из Java-программы - PullRequest
3 голосов
/ 28 января 2010

Хорошо, я столкнулся с ошибкой, которая просто сбила меня с толку. Я ищу идеи о том, что я мог бы расследовать, потому что сейчас у меня ничего нет. Это выглядит примерно так:

У меня есть отдельное Java-приложение, которому иногда нужно переключать том линейного входа компьютера, на котором он работает (машина WinXP). Это делается путем вызова пары внешних исполняемых файлов (написанных на VB6 *), которые могут получать и устанавливать различные тома компонентов. (Они могут работать с линейным входом, микрофоном, Wave, CD и основным регулятором громкости.)

Есть несколько сотен устройств, работающих на аппаратном обеспечении (компьютеры Dell), которые предоставлены и контролируются моей компанией. По крайней мере несколько десятков клиентов используют эту функцию, и она отлично работает - за исключением одного экземпляра.

Для этой одной проблемной машины она просто не работает. Я наблюдаю за ползунками громкости, когда приложение работает, и когда предполагается, что громкость падает, они остаются на месте. Когда я проверяю файл журнала приложения, он не выдает ошибок, и , кажется, выполняет код, который сбрасывает объем. Когда я запускаю исполняемые файлы из командной строки, они отлично работают.

Я не могу ручаться за то, что эта машина на 100% идентична всем тем, которые ведут себя должным образом, но мы уже давно покупаем одну и ту же линию Деллса; как минимум, это очень, очень похоже.

Итак, превращая мое замешательство в пулевой список:

  • Если я делаю что-то глупое в коде Java (т.е. не очищаю мои буферы STDOUT / STDERR), почему это проблема только на этом компьютере?
  • Если в исполняемых файлах VB6 что-то не работает, почему они работают на любой другой машине и на этой машине из командной строки?
  • Если на этом компьютере есть какая-то странная аппаратная странность, то какая такая странность может привести к сбою исполняемых файлов регулятора громкости только при вызове из приложения Java?

Я очень смущен. Я не люблю, когда меня путают. У кого-нибудь есть предложения, которые могут привести к моему просветлению? **

- * - Я знаю, я знаю, VB6, 1998 звонили, и они хотят вернуть свой устаревший проприетарный генератор ошибок и т. Д. Не было моего решения. Но код работает. Обычно.

- ** - Вставьте здесь шутку о буддизме.


Обновление правки: Возможно, служба поддержки клиентов наткнулась на что-то; это может быть связано с настройками конфигурации клиента в базе данных. Новые данные свидетельствуют о том, что либо что-то неправильно настроено для этого клиента, либо мое программное обеспечение делает что-то глупое в ответ на конкретную конфигурацию. И проблема может быть более распространенной, чем мы думали, потому что эта особенность используется не так часто, как я думал.

Отвечая на комментарии:

  • Отладчик: теоретически возможен, но выглядит как головная боль, учитывая нашу настройку.
  • High Verbosity Logging, Java: Хорошая идея, особенно если учесть, что проблема может быть более распространенной, чем я изначально полагал. Пора начать пересматривать некоторые предположения. И, возможно, клубить их. Как детские тюлени.
  • High Verbosity Logging, VB6: возможность; нужно будет свернуть в протоколирование Java с высокой степенью детализации, чтобы перехватить вывод, так как мой VB6-fu настолько плачевно слаб, что я не знаю, как выводить текст в файл. Но, да, знание того, вызывается ли сценарий или нет, было бы полезно.
  • Окно просмотра событий: не знаком с этим инструментом. Возможно, придется исправить это.
  • ПУТЬ проблема: не кажется вероятным; код Java создает относительный путь к исполняемому файлу, который не выглядит так, как будто он полагается на какие-либо переменные среды.

Благодарю за предложения, которые предоставили люди; по крайней мере, мой мозг двигается в направлении, которое кажется многообещающим.


Решение Редактировать: И победитель ... Это не ошибка, это особенность! Особенность пошла ужасно, ужасно неправильно. Функция, которая теперь будет кастрирована, чтобы перестать беспокоить нас.

Пакет недопустимых предположений не позволил мне увидеть это раньше, и не в последнюю очередь это было так: «Мне не нужно обрабатывать код большим количеством операторов отладки - операторы, которые уже есть, говорят мне все, что мне нужно знать !» DaDaDom, если вы хотите превратить свой комментарий в ответ, для вас есть блестящая галочка.

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

Ответы [ 3 ]

1 голос
/ 28 января 2010

Рассматривали ли вы возможность того, что прошедший проверку пользователь может не иметь разрешения на изменение настроек громкости на рабочей станции? Правильно ли работает программа, если вы работаете как «Администратор»?

1 голос
/ 29 января 2010

Вот ответ: Можете ли вы создать версию программного обеспечения с подробным ведением журнала или даже отладить код? По крайней мере, тогда вы можете сказать, находится ли он в части Java или VB.

1 голос
/ 28 января 2010

Хммм. Мне сказали, что выполнять программы из Java легко или сложно. Легкая часть их запускает. Сложная часть связана с потоками ввода / вывода (см. мой предыдущий вопрос об использовании Runtime.exec () ). Возможно, программа VB делает или ожидает чего-то странного на этих конкретных машинах, с которым код Java не работает должным образом.


редактировать: я также нашел ссылку на Джакарта Commons Exec :

Обоснование

Выполнение внешних процессов из Java является хорошо известной проблемной областью. Он изначально зависит от платформы и требует, чтобы разработчик знал и тестировал поведение платформы, например, используя cmd.exe в Windows или ограниченный размер буфера, вызывающий взаимные блокировки. Поддержка JRE для этого очень ограничена, хотя и лучше с новым классом Java SE 1.5 ProcessBuilder.

Для надежного выполнения внешних процессов также может потребоваться знание переменных среды до или после выполнения команды. В J2SE 1.1-1.4 это не поддерживается, так как метод System.getenv () для получения переменных среды устарел.

В настоящее время существует несколько различных библиотек, которые для собственных целей реализовали интегрированные среды вокруг Runtime.exec () для решения различных проблем, описанных выше. Предлагаемый проект должен быть направлен на координацию и изучение этих инициатив, чтобы создать и поддерживать простой, многократно используемый и хорошо проверенный пакет. Поскольку некоторые из наиболее проблемных платформ недоступны, я надеюсь, что широкое сообщество Apache может оказать большую помощь.

...