RFR: 8370044: TraceBytecodes shouldn't break up lines

Paul Hübner phubner at openjdk.org
Fri Feb 20 11:24:26 UTC 2026


Hi all, 

This patch addresses bytecodes being torn/mangled when printing concurrently (i.e., tracing the bytecodes of concurrently executing threads). Taking `invokeinterface` on `foo` as an example, the output could look something like the following two, ranging from mangled but legible to completely illegible:

jint[27651] [27395]   696080    64  invokeinterface,  116 <CoherentBytecodeTraceTest$Strategy.foo(I)V> 


[43267]   696692    64  invokeinterface
)
[33283] [27395] [27907]   696694    29  fast_agetfield 116 <CoherentBytecodeTraceTest$Strategy.foo(I)V> 


The solution is to buffer each bytecode print into a `stringStream` before giving it to the tty. This avoids having to take a tty lock. With this solution, the print looks as follows (note: different occurrence so surrounding bytecodes differ):

[25347]   685730    61  iconst_1
[25091]   685717    64  invokeinterface 190 <CoherentBytecodeTraceTest$Strategy.foo(I)V> 
[24579]   685732    20  invokestatic 125 <java/util/concurrent/ConcurrentHashMap.spread(I)I> 
[24579]   685734    23  istore #4


I introduce a test case that finds `<CoherentBytecodeTraceTest$Strategy.foo(I)V>` and ensures the bytecode preceding it is correct. This reliably failed every time previously, and does not fail after my change.

Parsing the code, I noticed that bytecode printing takes a parameter `bool buffer = true` which internally buffer to a `stringStream` before flushing to the provided `outputStream`. There were numerous places where the calling code was performing buffering itself without passing `buffer = false`, effectively double buffering. This has been addressed.

Testing: tiers 1-4. on Linux (x64, AArch64), macOS (x64, AArch64), Windows (x64).

-------------

Commit messages:
 - Explicit buffering handling.
 - Buffer debug bytecode trace.
 - Write test checking for mangled bytecodes.
 - Make tty passing a lot more explicit.

Changes: https://git.openjdk.org/jdk/pull/29842/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=29842&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8370044
  Stats: 174 lines in 8 files changed: 164 ins; 0 del; 10 mod
  Patch: https://git.openjdk.org/jdk/pull/29842.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/29842/head:pull/29842

PR: https://git.openjdk.org/jdk/pull/29842


More information about the hotspot-dev mailing list