Withdrawn: 8283488: AArch64: Improve stack trace accuracy in hs log
duke
duke at openjdk.java.net
Thu May 19 00:23:42 UTC 2022
On Tue, 22 Mar 2022 07:23:34 GMT, Denghui Dong <ddong at openjdk.org> wrote:
> Hi team,
>
> Could I have a review of this patch?
>
> The native stack trace in hs log is not accurate sometime since we cannot get the accurate `sender sp`, and `sp` is the key to walk stack for compiled frames.
>
>
> frame os::get_sender_for_C_frame(frame* fr) {
> return frame(fr->link(), fr->link(), fr->sender_pc());
> }
>
>
> JDK-8277948[1] solved the problem but the premise is that PreserveFramePointer needs to be enabled.
>
> For x86 platform, we can get the `sender sp` by `fp + 2`, but it does not hold in Aarch64.
>
> According to "Procedure Call Standard for the Arm® 64-bit Architecture (AArch64)[2]", section "6.2.3 The Frame Pointer" describes that the location of the frame record within a stack frame is not specified. Hence, I cannot get the `sender sp` by adding a constant to `fp`.
>
> By the way, I found that in the executable I compiled on mac m1, like x86, the frame record is always at the bottom of the stack, but I didn't find a standard specification to prove it. If we can guarantee that this is the case, we can simplify the solution on the mac
>
> This patch deduces the `sender sp` by decoding the native instructions, this solution is applicable to both Mac and Linux I think.
>
> At present, I found that there are mainly three patterns as follows:
>
>
> a)
> stp x29, x30, [sp, #-N]!
> mov x29, sp
> => sender sp = fp + N
>
> b)
> sub sp, sp, #N1
> stp x29, x30, [sp, #N2]
> add x29, sp, #N2
> => sender sp = fp + (N1 - N2)
>
> c)
> stp Xt1, Xt2, [sp, #-N1]! ; Xt1 is not x29, Xt2 is not x30
> stp x29, x30, [sp, #N2]
> add x29, sp, #N2
> => sender sp = fp + (N1 - N2)
>
>
> In addition, special treatment is required for two cases, you can refer to the comments in the code.
>
> To reduce the impact, deducing the `sender sp` is occurred only when a VM error is reported.
>
> I'm not sure if this solution is acceptable as it is a bit tricky, any input is appreciated.
>
> Worth mentioning, the stack trace may still not be accurate sometimes even if this patch is applied. One of the reasons is that `os::is_first_C_frame` will check the `sender fp`. Since `fp` is used as a general register in JIT(When PreserveFramePointer is diabled), it is usually not a reasonable `fp` value in the case of `jit code -> c code`, we may consider modifying the implementation of `os::is_first_C_frame` to apply this case.
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8277948
> [2] https://github.com/ARM-software/abi-aa/blob/320a56971fdcba282b7001cf4b84abb4fd993131/aapcs64/aapcs64.rst#the-frame-pointer
>
> Thanks,
> Denghui
This pull request has been closed without being integrated.
-------------
PR: https://git.openjdk.java.net/jdk/pull/7900
More information about the hotspot-dev
mailing list