@@ -365,40 +365,54 @@ void Profiler::populateRemoteFrame(ASGCT_CallFrame* frame, uintptr_t pc, CodeCac
365365 * - Returns is_marked=true if mark indicates termination (MARK_INTERPRETER, etc.)
366366 *
367367 * For traditional symbolication:
368- * - Does full symbol resolution via findNativeMethod()
368+ * - Does symbol resolution via binarySearch() on the found library
369369 * - Checks marks after symbol resolution (same O(log n) + O(1) cost)
370+ * - If no symbol found but PC is in a known library, packs as
371+ * BCI_NATIVE_FRAME_REMOTE for library-relative rendering ([lib+0xoffset])
370372 */
371373Profiler::NativeFrameResolution Profiler::resolveNativeFrameForWalkVM (uintptr_t pc, int lock_index) {
372- if (_remote_symbolication) {
373- CodeCache* lib = _libs->findLibraryByAddress ((void *)pc);
374- if (lib != nullptr && lib->hasBuildId ()) {
375- // Get symbol name and check mark
376- const char *method_name = nullptr ;
377- lib->binarySearch ((void *)pc, &method_name);
378- char mark = (method_name != nullptr ) ? NativeFunc::read_mark (method_name) : 0 ;
379-
380- if (mark != 0 ) {
381- return {nullptr , BCI_NATIVE_FRAME, true }; // Marked - stop processing
382- }
383-
384- // Pack remote symbolication data using utility struct
385- uintptr_t pc_offset = pc - (uintptr_t )lib->imageBase ();
386- uint32_t lib_index = (uint32_t )lib->libIndex ();
387- unsigned long packed = RemoteFramePacker::pack (pc_offset, mark, lib_index);
374+ CodeCache* lib = _libs->findLibraryByAddress ((void *)pc);
388375
389- TEST_LOG (" resolveNativeFrameForWalkVM: lib=%s, build_id=%s, pc=0x%lx, pc_offset=0x%lx, mark=%d, lib_index=%u, packed=0x%zx" ,
390- lib->name (), lib->buildId (), pc, pc_offset, (int )mark, lib_index, packed);
376+ if (_remote_symbolication && lib != nullptr && lib->hasBuildId ()) {
377+ // Get symbol name and check mark
378+ const char *method_name = nullptr ;
379+ lib->binarySearch ((void *)pc, &method_name);
380+ char mark = (method_name != nullptr ) ? NativeFunc::read_mark (method_name) : 0 ;
391381
392- return NativeFrameResolution (packed, BCI_NATIVE_FRAME_REMOTE, false );
382+ if (mark != 0 ) {
383+ return {nullptr , BCI_NATIVE_FRAME, true }; // Marked - stop processing
393384 }
385+
386+ // Pack remote symbolication data using utility struct
387+ uintptr_t pc_offset = pc - (uintptr_t )lib->imageBase ();
388+ uint32_t lib_index = (uint32_t )lib->libIndex ();
389+ unsigned long packed = RemoteFramePacker::pack (pc_offset, mark, lib_index);
390+
391+ TEST_LOG (" resolveNativeFrameForWalkVM: lib=%s, build_id=%s, pc=0x%lx, pc_offset=0x%lx, mark=%d, lib_index=%u, packed=0x%zx" ,
392+ lib->name (), lib->buildId (), pc, pc_offset, (int )mark, lib_index, packed);
393+
394+ return NativeFrameResolution (packed, BCI_NATIVE_FRAME_REMOTE, false );
394395 }
395396
396- // Fallback: Traditional symbol resolution
397- const char *method_name = findNativeMethod ((void *)pc);
397+ // Traditional symbol resolution
398+ const char *method_name = nullptr ;
399+ if (lib != nullptr ) {
400+ lib->binarySearch ((void *)pc, &method_name);
401+ }
398402 if (method_name != nullptr && NativeFunc::is_marked (method_name)) {
399403 return NativeFrameResolution (nullptr , BCI_NATIVE_FRAME, true );
400404 }
401405
406+ // No symbol but known library: pack for library-relative identification.
407+ // Reuses BCI_NATIVE_FRAME_REMOTE encoding; resolveMethod() in flightRecorder.cpp
408+ // distinguishes remote vs local rendering via hasBuildId() && isRemoteSymbolication().
409+ if (method_name == nullptr && lib != nullptr ) {
410+ uintptr_t pc_offset = pc - (uintptr_t )lib->imageBase ();
411+ uint32_t lib_index = (uint32_t )lib->libIndex ();
412+ unsigned long packed = RemoteFramePacker::pack (pc_offset, 0 , lib_index);
413+ return NativeFrameResolution (packed, BCI_NATIVE_FRAME_REMOTE, false );
414+ }
415+
402416 return NativeFrameResolution (method_name, BCI_NATIVE_FRAME, false );
403417}
404418
0 commit comments