Блог пользователя pcms-quesiton

Автор pcms-quesiton, 14 лет назад, По-русски
Доброго времени суток!

Я пытаюсь настроить систему pcms2, но не могу обойти такую ошибку:

ERR    compiler            - Thread compiler.1.CompilerThread-0 thrown exception. Restarting
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at pcms2.invoke.ni.java.InvokeJava.invoke(InvokeJava.java:50)
at pcms2.judging.invoke.VirtualInvoke.invoke(VirtualInvoke.java:316)
at pcms2.judging.compiler.Language.compile(Language.java:360)
at pcms2.judging.compiler.CompilerCompilerThread.processRequest(Compiler.java: 269)
atpcms2.judging.compiler.Compiler
CompilerThread.run(Compiler.java:221)
at pcms2.shell.impl.ThreadManagerLocalThread.run(ThreadManager.java: 316)    


Проще говоря, при посылке решения в систему падает компонента Compiler.       
Встречал ли кто-нибудь такой баг? Как с ним бороться? Можете ли вы выложить рабочую версию pcms2?
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я боюсь что это вопрос не на том ресурсе. Насколько я знаю, авторы pcms2 из Санкт-Петербургского государственного университета информационных технологий, механики и оптики. Можете поискать faq или что-то в этом роде на neerc.ifmo.ru/trains
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ну почему же - я думаю, что здесь есть аудитория из ИТМО. Просто, вероятно, ответ неочевиден.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    PCMS2 официально не поддерживается, так что в данном случае уместно "искать не где потерял, а где светлее"
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А где собственно сообщение об ошибке? Нужно справа выбрать компоненту Compiler, тогда в окне слева можно будет увидеть ее лог.

а в общем...

Я такие вопросы решал следующим образом. Достал из разных мест зоопарк разных версий PCMS2, в каждой из которых что-то одно не работает. Если в каком-то модуле происходит ошибка, jar заменяется аналогом из другой версии.

ну и еще, на всякий случай, ntinvoke.dll должен лежать в PATH


  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Compiler зелёненький, но при попытке скомпилировать решение ловит Exception и становится красненьким.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Какое сообщение об ошибке Compiler пишет в лог?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Такое: Thread compiler.1.CompilerThread-0 thrown exception. Restarting
        Подробнее в исходном посте.

        А что такое ntivoke.dll?
        Там есть просто invoke.dll, но его добавление в PATH ровным счётом ничего не делает :(
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Если прокрутить ползунок лога в положение "все сообщения", что видно выше?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Какие настройки компилятора? (XML-файлы compiler.xml, virtual-invoke.xml)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    compiler: http://pastebin.com/uyVKgjK0
    virtual-invoke: http://pastebin.com/1JRaWnXn

    Оба лежат в config/judging
    Оба, вроде бы, по умолчанию.
    Пробовал fpc, dcc32, g++, java
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Все никак не освоюсь с тем, по какой ссылке надо щелкнуть, чтобы ответить. Ответ тут
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
1. Java так компилять нехорошо, вложенные классы будут плохо работать. Но сейчас не об этом.

2. Из командной строки вышеозначенные компиляторы запускаются?

3. Есть файлы native-invoke-java.xml и native-invoke-nt.xml. Первый должен быть start="never", второй start="always". Первый, сдается мне, уже давно не работает.

4. До попытки сабмита все в сервере "живет"?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Поясняю. native-invoke-java - это "затычка", которая запускает программы с помощью Runtime.getRuntime().<и-так-далее>. Она была deprecated с самого начала, а сейчас и вовсе не работает. Надо пользоваться native-invoke-nt (разумеется, под виндами), она делает то же самое, что и всем известный run, и через ту же библиотеку invoke.dll.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      1. А как хорошо? Я ничего не менял кроме gpp -> g++.
      2. Да, запускаются.
      3. Если поставить в native-invoke-nt.xml start = "always", а в ...-java start="never", то получается баг    Component's class is not specified.
      4. Да, всё живёт.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Component's class is not specified - это симптом того, что invoke.dll не находится. Положите его в system32, или укажите на директорию, в которой он лежит, с помощью опции командной строки java -Djava.library.path=<директория> при запуске сервера (в pcms2.bat).
        • 11 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          делал так. java -D java.library.path=invoke.dll потом так java -D java.library.path=c:\windows\system32\invoke.dll Не работает! Error: Could not find or load main class java.library.path=invoke.dll

          • 11 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            В -Djava.library.path надо указывать путь к директории с invoke.dll, а не к самой invoke.dll.

            Между -D и java.library.path пробелов быть не должно.

            И это дополнительная опция командной строки java, а не вся командная строка. Имелось в виду то, что в pcms2.bat надо найти вызов java и дописать туда опцию про java.library.path.

            • 11 лет назад, # ^ |
              Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

              Вот так? Я ничего не перепутал?

              java -Djava.library.path="c:\windows\sytem32\"

              • 11 лет назад, # ^ |
                Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                Если оно в C:\Windows\System32, то как раз в этом случае ничего писать не надо, так как эта директория и так будет просматриваться на предмет поиска библиотеки.

                Не знаю, как сейчас, у меня pcms2.bat имеет следующее содержание:

                cd ..
                
                call bin\runjava.bat pcms2.shell.Main bin\shell.properties
                
                cd bin
                

                Вот после bin\runjava.bat можно писать -Djava.library.path=...

                Можно еще подкорректировать runjava.bat. Там тогда будет такая строчка:

                "%JAVA_HOME%\bin\java.exe" -Djava.library.path=.\lib -showversion -Xms128M -Xmx1024M -Xbootclasspath/a:%PCMS2_BOOTCP% %PCMS2_ARGS%
                

                Обращаю внимание на то, что при просмотре приведенных примеров файлов на codeforces могут случиться непредвиденные и некорректные переносы строк.

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Как компилять java, расскажу, когда остальное запустим.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Теперь всё запускается и работает. Compiler не падает и пишет в логи, что он всё удачно скомпилил.
          Но решения всё равно не проверяются: executable not found.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ух. Сталкивался тоже, только вот решения уже не помню.

            1. Что за язык, на котором пробовал? (В т.ч. его название в compiler.xml)
            2.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            2. В директории, где все компиляется, экзешник есть? (это runs/<длинный-номер-run'а>/<еще-что-то>)
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            +пока не забыл:
            1) Все компиляторы C++ компилируют по умолчанию без оптимизации. Всем надо, соответственно, нарисовать -O2 (для вижака /O2).
            2) Есть, оказывается, прикол: STL-ные решения частенько работают под invoke.dll гораздо медленнее, чем "в жизни". Это связано с настройками винды по умолчанию. Чтобы поправить ситуацию, нужно потвикать реестр. Как именно, спрошу, когда надо будет.
            • 12 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              А можно второй пункт поподробнее, что надо прописывать в реестр? Кажется, мы с этим столкнулись.

              Да, это некропост.

              • 12 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                • 12 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится

                  Я сомневаюсь, ведь это надо каждый exe-шник переименовывать. PCMS вроде это не умеет.

                  • 12 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится

                    По ссылке выше, видимо, правильное решение (по буквам не проверял). Не надо ничего переименовывать руками. В ключах любого компилятора можно указать имя получаемого исполняемого файла. Поэтому в ключах gcc будет, например, в частности и [-o] [FastHeap.exe].