Skip to content

[CoreCLR/NativeAOT] Migrate JNI reference logging to printf#12150

Open
simonrozsival wants to merge 3 commits into
dev/simonrozsival/nativeaot-printf-loggingfrom
dev/simonrozsival/nativeaot-jni-reference-printf-logging
Open

[CoreCLR/NativeAOT] Migrate JNI reference logging to printf#12150
simonrozsival wants to merge 3 commits into
dev/simonrozsival/nativeaot-printf-loggingfrom
dev/simonrozsival/nativeaot-jni-reference-printf-logging

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Summary

Continue the printf-style logging migration introduced by #12140 by converting shared CoreCLR/NativeAOT JNI reference logging in OSBridge.

The src/native/clr/ location is shared infrastructure: the NativeAOT host explicitly compiles clr/host/os-bridge.cc, while MonoVM uses its separate mono/monodroid/osbridge.cc implementation. This PR therefore affects CoreCLR and NativeAOT, but not MonoVM.

Base/dependency: #12140 must merge first. This PR targets dev/simonrozsival/nativeaot-printf-logging so its diff contains only this migration.

Part of #12139.

Scope

Only two files change:

  • src/native/clr/host/os-bridge.cc
  • src/native/clr/include/host/os-bridge.hh

This does not overlap the open sibling work:

Changes

Format reference records once

  • add a private printf-checked OSBridge::log_itf() helper;
  • use vasprintf() to produce one NUL-terminated reference-log line;
  • pass the same formatted line to the existing logcat and file-writing path;
  • release the C allocation after both destinations have consumed it;
  • on allocation failure, fall back to the static format string rather than throwing from a noexcept std::format path.

Migrate JNI reference events

Replace six owning std::format constructions:

  • new global reference;
  • deleted global reference;
  • new weak global reference;
  • deleted weak global reference;
  • new local reference;
  • deleted local reference.

The replacements use %d, %p, %c, and %s with compiler format checking from the private helper declaration.

Remove ranges-heavy stack-trace splitting

  • replace std::views::split with an in-place std::string_view newline scan;
  • preserve empty, consecutive, and trailing lines;
  • preserve logcat-only, file-only, and combined output behavior;
  • write non-NUL-terminated line views with explicit lengths;
  • convert stack-trace and raw gref logcat forwarding to %.*s / %s.

Responsibility boundary with #12141

  • GCBridge ([NativeAOT] Use POSIX primitives for GC bridge processing #12141) controls when and where a bridge round runs: callback handoff, worker thread, semaphore synchronization, and Java GC triggering.
  • OSBridge (this PR) tracks and logs JNI reference events: gref/weak-gref counters, reference creation/deletion lines, and optional stack traces.

The classes call each other through existing stable helpers, but this PR changes no GC scheduling, graph processing, callback lifecycle, or synchronization state.

Behavior preserved

  • reference counters are incremented/decremented at the same points;
  • logging remains gated by LOG_GREF / LOG_LREF before formatting;
  • each reference line is still emitted to logcat and, when configured, the corresponding file;
  • stack traces retain one output line per newline-delimited segment, including empty segments;
  • logcat/file flushing behavior is unchanged;
  • pointer, reference-type, thread-name, thread-id, and counter fields retain the same ordering and textual structure.

Measured impact

Android arm64 Release NativeAOT os-bridge.cc object, compiled with the repository-generated production NDK command:

Artifact Before After Difference
os-bridge.cc.o 168,784 B 31,288 B -137,496 B (-81.46%)
format/basic-string symbols 21 6 -15

The remaining C++ string symbols come from other shared header functionality; the six std::format reference-log instantiations are removed.

Non-goals

  • no new logging test framework is introduced;
  • no GC bridge synchronization or graph-processing code changes;
  • no MonoVM osbridge.cc changes;
  • no changes to the public logging helpers introduced by [Native] Add printf-style native logging #12140.

Validation

Format gref/lref records once with C varargs, preserve logcat/file output, and remove std::format and ranges-heavy splitting from OSBridge.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Copilot AI review requested due to automatic review settings July 17, 2026 10:32
@simonrozsival simonrozsival added the drop-libcpp Work to remove the libc++ dependency from Android NativeAOT label Jul 17, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR continues the NativeAOT/CoreCLR printf-style logging migration by updating OSBridge’s JNI reference logging to avoid std::format (and std::views::split) while preserving the existing dual-destination behavior (logcat + optional files).

Changes:

  • Introduces a private OSBridge::log_itf() helper that formats a single reference-log record via vasprintf() and forwards the same formatted line to logcat/file paths.
  • Migrates gref/weak-gref/lref create/delete reference event logging to printf formatting (%d, %p, %c, %s) with compile-time format checking.
  • Replaces ranges-based stack-trace splitting with an in-place std::string_view newline scan that preserves empty/trailing segments and writes non-NUL-terminated segments safely using explicit lengths.
Show a summary per file
File Description
src/native/clr/include/host/os-bridge.hh Updates the private logging helper signatures to use std::string_view and adds a printf-checked log_itf() declaration.
src/native/clr/host/os-bridge.cc Implements log_itf() using vasprintf(), migrates reference event logging away from std::format, and replaces ranges-based stack-trace splitting with a manual string_view scan.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 70f63eb7-6599-414c-a947-d860705aa0fa
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

drop-libcpp Work to remove the libc++ dependency from Android NativeAOT

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants