From 2340e3f3aaa5935e064b32503512b7809e1ca165 Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Mon, 12 Dec 2016 19:37:19 -0800 Subject: [PATCH] ART: Fix stack trace location reporting The frame info contains the location, not the line number. Add location to output. Bug: 31684812 Test: m test-art-host-run-test-911-get-stack-trace Change-Id: Iac3db17fb32e9a7f83ca9f3614dee0d16fd2120d --- runtime/openjdkjvmti/ti_stack.cc | 10 +- test/911-get-stack-trace/expected.txt | 358 ++++++++++++++++---------------- test/911-get-stack-trace/stack_trace.cc | 6 +- 3 files changed, 187 insertions(+), 187 deletions(-) diff --git a/runtime/openjdkjvmti/ti_stack.cc b/runtime/openjdkjvmti/ti_stack.cc index 6f8976f03..579fb50ec 100644 --- a/runtime/openjdkjvmti/ti_stack.cc +++ b/runtime/openjdkjvmti/ti_stack.cc @@ -67,14 +67,10 @@ struct GetStackTraceVisitor : public art::StackVisitor { m = m->GetInterfaceMethodIfProxy(art::kRuntimePointerSize); jmethodID id = art::jni::EncodeArtMethod(m); - art::mirror::DexCache* dex_cache = m->GetDexCache(); - int32_t line_number = -1; - if (dex_cache != nullptr) { // be tolerant of bad input - const art::DexFile* dex_file = dex_cache->GetDexFile(); - line_number = art::annotations::GetLineNumFromPC(dex_file, m, GetDexPc(false)); - } + uint32_t dex_pc = GetDexPc(false); + jlong dex_location = (dex_pc == art::DexFile::kDexNoIndex) ? -1 : static_cast(dex_pc); - jvmtiFrameInfo info = { id, static_cast(line_number) }; + jvmtiFrameInfo info = { id, dex_location }; frames.push_back(info); if (stop == 1) { diff --git a/test/911-get-stack-trace/expected.txt b/test/911-get-stack-trace/expected.txt index 409c31805..77c77ca21 100644 --- a/test/911-get-stack-trace/expected.txt +++ b/test/911-get-stack-trace/expected.txt @@ -3,206 +3,206 @@ ################### From top --------- - getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String; - print (Ljava/lang/Thread;II)V - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - doTest ()V - main ([Ljava/lang/String;)V ---------- - print (Ljava/lang/Thread;II)V - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - doTest ()V - main ([Ljava/lang/String;)V ---------- - getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String; - print (Ljava/lang/Thread;II)V - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J ---------- - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; + getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String; -1 + print (Ljava/lang/Thread;II)V 0 + printOrWait (IILMain$ControlData;)V 6 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + doTest ()V 38 + main ([Ljava/lang/String;)V 6 +--------- + print (Ljava/lang/Thread;II)V 0 + printOrWait (IILMain$ControlData;)V 6 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + doTest ()V 42 + main ([Ljava/lang/String;)V 6 +--------- + getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String; -1 + print (Ljava/lang/Thread;II)V 0 + printOrWait (IILMain$ControlData;)V 6 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 +--------- + printOrWait (IILMain$ControlData;)V 6 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 From bottom --------- - main ([Ljava/lang/String;)V + main ([Ljava/lang/String;)V 6 --------- - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - doTest ()V - main ([Ljava/lang/String;)V + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + doTest ()V 65 + main ([Ljava/lang/String;)V 6 --------- - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 ################################ ### Other thread (suspended) ### ################################ From top --------- - wait ()V - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - run ()V ---------- - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - run ()V ---------- - wait ()V - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I ---------- - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J + wait ()V -1 + printOrWait (IILMain$ControlData;)V 24 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + run ()V 4 +--------- + printOrWait (IILMain$ControlData;)V 24 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + run ()V 4 +--------- + wait ()V -1 + printOrWait (IILMain$ControlData;)V 24 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 +--------- + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 From bottom --------- - run ()V + run ()V 4 --------- - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - run ()V + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + run ()V 4 --------- - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 ########################### ### Other thread (live) ### ########################### From top --------- - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - run ()V ---------- - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - run ()V ---------- - printOrWait (IILMain$ControlData;)V - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; ---------- - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I + printOrWait (IILMain$ControlData;)V 44 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + run ()V 4 +--------- + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + run ()V 4 +--------- + printOrWait (IILMain$ControlData;)V 44 + baz (IIILMain$ControlData;)Ljava/lang/Object; 2 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 +--------- + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 From bottom --------- - run ()V + run ()V 4 --------- - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - run ()V + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + run ()V 4 --------- - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J - foo (IIILMain$ControlData;)I - baz (IIILMain$ControlData;)Ljava/lang/Object; - bar (IIILMain$ControlData;)J + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 + foo (IIILMain$ControlData;)I 0 + baz (IIILMain$ControlData;)Ljava/lang/Object; 9 + bar (IIILMain$ControlData;)J 0 diff --git a/test/911-get-stack-trace/stack_trace.cc b/test/911-get-stack-trace/stack_trace.cc index d5627531c..b5b5678f5 100644 --- a/test/911-get-stack-trace/stack_trace.cc +++ b/test/911-get-stack-trace/stack_trace.cc @@ -16,11 +16,13 @@ #include "stack_trace.h" +#include #include #include #include "base/logging.h" #include "base/macros.h" +#include "base/stringprintf.h" #include "jni.h" #include "openjdkjvmti/jvmti.h" #include "ScopedLocalRef.h" @@ -65,11 +67,13 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getStackTrace( return (name == nullptr) ? nullptr : env->NewStringUTF(name); case 1: return (sig == nullptr) ? nullptr : env->NewStringUTF(sig); + case 2: + return env->NewStringUTF(StringPrintf("%" PRId64, frames[method_index].location).c_str()); } LOG(FATAL) << "Unreachable"; UNREACHABLE(); }; - jobjectArray inner_array = CreateObjectArray(env, 2, "java/lang/String", inner_callback); + jobjectArray inner_array = CreateObjectArray(env, 3, "java/lang/String", inner_callback); if (name != nullptr) { jvmti_env->Deallocate(reinterpret_cast(name)); -- 2.11.0