RFR: 8277948: AArch64: Print the correct native stack if -XX:+PreserveFramePointer when crash

Denghui Dong ddong at openjdk.java.net
Sat Jan 15 15:03:29 UTC 2022


On Fri, 7 Jan 2022 14:28:05 GMT, Andrew Haley <aph at openjdk.org> wrote:

> > > I've had a good look at this - in fact spent all morning on it - and this is the wrong fix.
> > > For example, it breaks the `pfl()` function in the test case. `pfl()` isn't called from anywhere in the JDK, but it is one of our essential debugging tools. If you're interested in pursuing this further I could explain what else to try, but I don't have any time to spend on this myself. Sorry.
> > 
> > 
> > Thanks for the comment. It would be nice if you could give me some other way that helps fix the problem.
> 
> OK. The following changes cause `dtrace_object_alloc()` to call `pfl()`. This should print the entire stack. (You can also clone https://github.com/theRealAph/jdk , branch `pull/6597` for the same code. With your patch included and `PreserveFramePointer` enabled, `pfl()` crashes. So it seems like your patch fixes one thing, but breaks other uses of stack walking.
> 
> ```
> diff --git a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp
> index 661fad89e47..3fa80da73f7 100644
> --- a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp
> +++ b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp
> @@ -237,7 +237,9 @@ void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register
>  
>    if (CURRENT_ENV->dtrace_alloc_probes()) {
>      assert(obj == r0, "must be");
> +    set_last_Java_frame(sp, rfp, (address)pc(), rscratch1);
>      far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::dtrace_object_alloc_id)));
> +    reset_last_Java_frame(true);
>    }
>  
>    verify_oop(obj);
> @@ -270,7 +272,9 @@ void C1_MacroAssembler::allocate_array(Register obj, Register len, Register t1,
>  
>    if (CURRENT_ENV->dtrace_alloc_probes()) {
>      assert(obj == r0, "must be");
> +    set_last_Java_frame(sp, rfp, (address)pc(), rscratch1);
>      far_call(RuntimeAddress(Runtime1::entry_for(Runtime1::dtrace_object_alloc_id)));
> +    reset_last_Java_frame(true);
>    }
>  
>    verify_oop(obj);
> diff --git a/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp
> index 005f739f0aa..b1da03398cf 100644
> --- a/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp
> +++ b/src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp
> @@ -1091,7 +1091,9 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
>          StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments);
>          save_live_registers(sasm);
>  
> +        __ set_last_Java_frame(sp, rfp, (address)(__ pc()), rscratch1);
>          __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc)), c_rarg0);
> +        __ reset_last_Java_frame(true);
>  
>          restore_live_registers(sasm);
>        }
> diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp
> index a5de65ea5ab..5e09a1de120 100644
> --- a/src/hotspot/share/runtime/sharedRuntime.cpp
> +++ b/src/hotspot/share/runtime/sharedRuntime.cpp
> @@ -996,12 +996,16 @@ jlong SharedRuntime::get_java_tid(Thread* thread) {
>    return 0;
>  }
>  
> +extern "C" void pfl();
> +
>  /**
>   * This function ought to be a void function, but cannot be because
>   * it gets turned into a tail-call on sparc, which runs into dtrace bug
>   * 6254741.  Once that is fixed we can remove the dummy return value.
>   */
>  int SharedRuntime::dtrace_object_alloc(oopDesc* o) {
> +  pfl();
> +  *(int*)0 = 1;
>    return dtrace_object_alloc(Thread::current(), o, o->size());
>  }
>  
> ```

Thanks.

`frame::sender_for_entry_frame` also uses anchor to build the sender's frame, I fixed.
Also, I change the name '_from_thread' to '_from_anchor', I think the latter is more suitable.

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

PR: https://git.openjdk.java.net/jdk/pull/6597


More information about the hotspot-dev mailing list