outputStream's position not updated by disassembler

Krystal Mok rednaxelafx at gmail.com
Mon Dec 12 06:54:39 PST 2011


Hi all,

Got around to look at this issue again today, and it turns out the fix was
fairly simple:

In VMError, a staticBufferStream was used to write out the contents of the
crash log. staticBufferStream never updates its own _position, probably
because it was thought to be redundant, that the underlying _outer_stream
should have updated position correctly.

hsdis relies on positional info to be correct to write the newlines (with
st->bol() ), but since staticBufferStream doesn't update its own position,
bol() never calls cr() in this case.

The simplest fix would be to call update_position() in
staticBufferStream::write(), albeit redundant. outputStream::position()
isn't virtual, so it can't be overridden by staticBufferStream to use its
underlying _outer_stream's position.

An updated, but still quick-n-dirty patch to disassemble instructions in
HotSpot's crash log is at [1].

The patch is only meant for my debugging purposes, though. I'm not
purposing an RFE here, just answering my own question.

- Kris

[1]: https://gist.github.com/1467547

On Fri, Sep 9, 2011 at 3:11 PM, Krystal Mok <rednaxelafx at gmail.com> wrote:

> Hi all,
>
> I tried to add disassembly support in VM error reporting, but had a couple
> of issues.
> The result I'm looking for is something like this:
>
> Instructions: (pc=0x00002b148974ddf2)
> 0x00002b148974ddd2:   48 8b 05 17 0d 42 00 41 c7 85 48 02 00 00 06 00
> 0x00002b148974dde2:   00 00 8b 38 e8 ed 3f 9a ff c6 80 6c 02 00 00 01
> 0x00002b148974ddf2:   45 89 26 c6 80 6c 02 00 00 00 48 8b 5b 48 48 8b
> 0x00002b148974de02:   7b 10 4c 8b 63 08 48 83 3f 00 74 09 e8 cd 6f a3
>
> [Disassembling for mach='i386:x86-64']
>   0x00002b148974ddf2: mov    %r12d,(%r14)
>   0x00002b148974ddf5: movb   $0x0,0x26c(%rax)
>   0x00002b148974ddfc: mov    0x48(%rbx),%rbx
>   0x00002b148974de00: mov    0x10(%rbx),%rdi
>   ...
>
> I'm working on Linux/x64, HS20-b11. If I made this change to reuse
> the disassembler plugin (if available):
>
> diff -r f0f676c5a2c6 src/os_cpu/linux_x86/vm/os_linux_x86.cpp
> --- a/src/os_cpu/linux_x86/vm/os_linux_x86.cpp  Tue Mar 15 19:30:16 2011
> -0700
> +++ b/src/os_cpu/linux_x86/vm/os_linux_x86.cpp  Fri Sep 09 14:50:16 2011
> +0800
> @@ -29,6 +29,7 @@
>  #include "classfile/vmSymbols.hpp"
>  #include "code/icBuffer.hpp"
>  #include "code/vtableStubs.hpp"
> +#include "compiler/disassembler.hpp"
>  #include "interpreter/interpreter.hpp"
>  #include "jvm_linux.h"
>  #include "memory/allocation.inline.hpp"
> @@ -808,6 +809,11 @@
>    address pc = os::Linux::ucontext_get_pc(uc);
>    st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
>    print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
> +
> +  // dump disassembly near pc
> +  st->cr();
> +  Disassembler::decode(pc, pc + 32, st);
> +  st->cr();
>  }
>
>  void os::print_register_info(outputStream *st, void *context) {
>
>
> Then the disassembly output I'm getting misses all newlines at the end of
> each instruction, like this:
>
> [Disassembling for mach='i386:x86-64']
>   0x00002b148974ddf2: mov    %r12d,(%r14)  0x00002b148974ddf5: movb
> $0x0,0x26c(%rax) ...
>
> Tracing down, the newlines are requested by the disassembler plugin (hsdis
> in this case), handled by printf_to_env(void* env_pv, const char* format,
> ...), which in turn calls outputStream::bol().
> bol() decides whether or not to write a newline depending on the current
> position. By instrumenting printf_to_env, I found that the position was
> always 0 during disassembling, which caused the problem of missing newlines.
>
> But the same plugin, when used in situations like PrintInterpreter, works
> fine; the position gets updated correctly, and no newlines are lost.
>
> Does anyone have any idea what might have caused the difference? The
> outputStream instances are different, sure, but staticBufferStream used
> in error reporting look pretty innocent to me.
>
> P.S. I could just work around this by changing the bol() call to a cr()call. But that feels hackish, and I'm looking for a cleaner solution.
>
> Regards,
> Kris Mok
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-dev/attachments/20111212/e602d7b5/attachment.html 


More information about the hotspot-dev mailing list