Маршалинг Струны в Рубине - PullRequest
       35

Маршалинг Струны в Рубине

1 голос
/ 05 октября 2011

Я сталкиваюсь с ошибкой при использовании Capistrano. Я сузил ошибку до буквально этой строки кода:

puts message

Где "message" - это строка, которая пришла с удаленного сервера через net-ssh.

Итак, я пытаюсь создать один файл .rb, который воспроизводит эту ошибку. Должно быть легко ... Я просто Marshal.dump(message), копирую / вставляю то, что это дает мне в Marshal.load(...) в моем сценарии.

Но когда я делаю это, мой единственный файл .rb работает безупречно.

Итак, я проверил свое приложение, и когда я маршал и сразу же разархивировал строку в capistrano, она работает. Так что что-то теряется в маршалинге и мешает мне надежно продублировать ошибку.

Я использую jruby:

jruby 1.6.4 (ruby-1.9.2-p136) (2011-08-23 17ea768) (Java HotSpot(TM) Client VM 1.6.0_26) [Windows 7-x86-java]

Ошибка на путах

ByteBuffer.java:352:in `wrap': java.lang.IndexOutOfBoundsException
        from ChannelDescriptor.java:618:in `write'
        from RubyIO.java:1386:in `fwrite'
        from RubyIO.java:1319:in `write'
        from RubyIO$i$1$0$write.gen:65535:in `call'
        from RubyClass.java:686:in `finvoke'
        from RuntimeHelpers.java:548:in `invoke'
        from RubyBasicObject.java:358:in `callMethod'
        from RubyIO.java:2297:in `write'
        from RubyIO.java:2283:in `putsArray'
        from RubyIO.java:2252:in `puts'
        from RubyKernel.java:522:in `puts'
        from RubyKernel$s$0$0$puts.gen:65535:in `call'
        from JavaMethod.java:630:in `call'
        from DynamicMethod.java:207:in `call'
        from CachingCallSite.java:167:in `call'
        from FCallOneArgNode.java:36:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from IfNode.java:117:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from ASTInterpreter.java:112:in `INTERPRET_BLOCK'
        from Interpreted19Block.java:203:in `evalBlockBody'
        from Interpreted19Block.java:154:in `yield'
        from Block.java:130:in `yield'
        from RubyString.java:6830:in `each_lineCommon19'
        from RubyString.java:6801:in `each_lineCommon19'
        from RubyString.java:6790:in `lines'
        from RubyString$i$lines.gen:65535:in `call'
        from JavaMethod.java:442:in `call'
        from RubyClass.java:544:in `finvoke'
        from RuntimeHelpers.java:541:in `invoke'
        from RubyBasicObject.java:382:in `callMethod'
        from RubyEnumerator.java:190:in `each'
        from RubyEnumerator$i$0$0$each.gen:65535:in `call'
        from CachingCallSite.java:142:in `callBlock'
        from CachingCallSite.java:153:in `callIter'
        from CallNoArgBlockNode.java:64:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from BlockNode.java:71:in `interpret'
        from IfNode.java:117:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from BlockNode.java:71:in `interpret'
        from ASTInterpreter.java:75:in `INTERPRET_METHOD'
        from InterpretedMethod.java:276:in `call'
        from DefaultMethod.java:211:in `call'
        from CachingCallSite.java:235:in `call'
        from FCallThreeArgNode.java:40:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from ASTInterpreter.java:75:in `INTERPRET_METHOD'
        from InterpretedMethod.java:255:in `call'
        from DefaultMethod.java:203:in `call'
        from RubyClass.java:582:in `finvoke'
        from RubyBasicObject.java:1697:in `send19'
        from RubyKernel.java:2121:in `send19'
        from RubyKernel$s$send19.gen:65535:in `call'
        from JavaMethod.java:300:in `call'
        from CachingCallSite.java:235:in `call'
        from CallThreeArgNode.java:61:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from BlockNode.java:71:in `interpret'
        from ASTInterpreter.java:112:in `INTERPRET_BLOCK'
        from Interpreted19Block.java:203:in `evalBlockBody'
        from Interpreted19Block.java:191:in `yield'
        from Interpreted19Block.java:122:in `call'
        from Block.java:89:in `call'
        from RubyProc.java:274:in `call'
        from RubyProc.java:262:in `call19'
        from RubyProc$i$0$0$call19.gen:65535:in `call'
        from DynamicMethod.java:227:in `call'
        from DynamicMethod.java:223:in `call'
        from CachingCallSite.java:235:in `call'
        from CallThreeArgNode.java:61:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from BlockNode.java:71:in `interpret'
        from ASTInterpreter.java:112:in `INTERPRET_BLOCK'
        from Interpreted19Block.java:203:in `evalBlockBody'
        from Interpreted19Block.java:191:in `yield'
        from Interpreted19Block.java:122:in `call'
        from Block.java:89:in `call'
        from RubyProc.java:274:in `call'
        from RubyProc.java:262:in `call19'
        from RubyProc$i$0$0$call19.gen:65535:in `call'
        from DynamicMethod.java:219:in `call'
        from DynamicMethod.java:215:in `call'
        from CachingCallSite.java:201:in `call'
        from CallTwoArgNode.java:59:in `interpret'
        from IfNode.java:117:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from BlockNode.java:71:in `interpret'
        from ASTInterpreter.java:75:in `INTERPRET_METHOD'
        from InterpretedMethod.java:190:in `call'
        from DefaultMethod.java:179:in `call'
        from CachingCallSite.java:312:in `cacheAndCall'
        from CachingCallSite.java:169:in `call'
        from CallOneArgNode.java:57:in `interpret'
        from NewlineNode.java:104:in `interpret'
        from BlockNode.java:71:in `interpret'
        from ASTInterpreter.java:75:in `INTERPRET_METHOD'
        from InterpretedMethod.java:212:in `call'
        from DefaultMethod.java:187:in `call'
        from RubyClass.java:563:in `finvoke'
        from RubyBasicObject.java:1691:in `send19'
        from RubyKernel.java:2117:in `send19'
        from RubyKernel$s$send19.gen:65535:in `call'
        from JavaMethod.java:283:in `call'

Это продолжается дольше, но это просто набор динамических вызовов методов.

Ошибка также представляет различные ошибки на puts "#{message}" и puts "#{message.strip}"

Ответы [ 2 ]

0 голосов
/ 14 октября 2011

Это ошибка в JRuby 1.6.4. Это было исправлено в ветке 1_6 и должно быть исправлено в версии 1.6.5.

Подробнее об этом можно прочитать здесь:

https://jira.codehaus.org/browse/JRUBY-6116

Короче говоря: используйте str = Marshal.load(Marshal.dump(str)), если хотите остаться на 1.6.4

edit: 1.6.5 был выпущен и содержит это исправление.

0 голосов
/ 05 октября 2011

Возможно, сообщение является другим видом объекта ruby, присваиваемым в семействе классов ruby ​​IO http://www.ruby -doc.org / core / IO.html и не String, а какой-тобуфер, который приходит из сессии ssh.Попробуйте Marshal.dump(message.to_s) или введите message.class, чтобы проверить, что это на самом деле.

...