@@ -3839,7 +3839,7 @@ erts_max_heap_size(Eterm arg, Uint *max_heap_size, Uint *max_heap_flags)
38393839 return 1 ;
38403840}
38413841
3842- #ifdef DEBUG
3842+ #if defined( DEBUG ) && defined( ERLANG_FRAME_POINTERS )
38433843void erts_validate_stack (Process * p , Eterm * frame_ptr , Eterm * stack_top ) {
38443844 Eterm * stack_bottom = HEAP_END (p );
38453845 Eterm * next_fp = frame_ptr ;
@@ -3853,20 +3853,24 @@ void erts_validate_stack(Process *p, Eterm *frame_ptr, Eterm *stack_top) {
38533853 ASSERT ((next_fp != NULL ) ^ (stack_top == stack_bottom ));
38543854
38553855 /* If the GC happens when we are about to execute a trace we
3856- need to skip the trace instructions */
3856+ need to skip the trace instructions.
3857+ Note: It's not safe in general to assume p->i is up-to-date in GC.
3858+ However the return trace intructions do update p->i after returning.
3859+ */
38573860 if (BeamIsReturnTrace (p -> i )) {
3858- /* Skip MFA and tracer. */
3859- ASSERT_MFA ((ErtsCodeMFA * )cp_val (scanner [0 ]));
3860- ASSERT (IS_TRACER_VALID (scanner [1 ]));
3861+ assert_return_trace_frame (scanner );
38613862 scanner += BEAM_RETURN_TRACE_FRAME_SZ ;
38623863 } else if (BeamIsReturnCallAccTrace (p -> i )) {
3863- /* Skip prev_info. */
3864+ assert_return_call_acc_trace_frame ( scanner );
38643865 scanner += BEAM_RETURN_CALL_ACC_TRACE_FRAME_SZ ;
38653866 } else if (BeamIsReturnToTrace (p -> i )) {
3867+ assert_return_to_trace_frame (scanner );
38663868 scanner += BEAM_RETURN_TO_TRACE_FRAME_SZ ;
38673869 }
38683870
38693871 while (next_fp ) {
3872+ ErtsCodePtr cp ;
3873+
38703874 ASSERT (next_fp >= stack_top && next_fp <= stack_bottom );
38713875
38723876 /* We may not skip any frames. */
@@ -3876,24 +3880,24 @@ void erts_validate_stack(Process *p, Eterm *frame_ptr, Eterm *stack_top) {
38763880 }
38773881
38783882 /* {Next frame, Return address} or vice versa */
3879- ASSERT (is_CP (scanner [0 ]) && is_CP (scanner [1 ]));
38803883 next_fp = (Eterm * )cp_val (scanner [0 ]);
3884+ cp = cp_val (scanner [1 ]);
3885+
3886+ scanner += CP_SIZE ;
38813887
38823888 /* Call tracing may store raw pointers on the stack. This is explicitly
38833889 * handled in all routines that deal with the stack. */
3884- if (BeamIsReturnTrace ((ErtsCodePtr )scanner [1 ])) {
3885- /* Skip MFA and tracer. */
3886- ASSERT_MFA ((ErtsCodeMFA * )cp_val (scanner [2 ]));
3887- ASSERT (IS_TRACER_VALID (scanner [3 ]));
3890+ if (BeamIsReturnTrace (cp )) {
3891+ assert_return_trace_frame (scanner );
38883892 scanner += BEAM_RETURN_TRACE_FRAME_SZ ;
3889- } else if (BeamIsReturnCallAccTrace (( ErtsCodePtr ) scanner [ 1 ] )) {
3890- /* Skip prev_info. */
3893+ } else if (BeamIsReturnCallAccTrace (cp )) {
3894+ assert_return_call_acc_trace_frame ( scanner );
38913895 scanner += BEAM_RETURN_CALL_ACC_TRACE_FRAME_SZ ;
3892- } else if (BeamIsReturnToTrace ((ErtsCodePtr )scanner [1 ])) {
3896+ } else if (BeamIsReturnToTrace (cp )) {
3897+ assert_return_to_trace_frame (scanner );
38933898 scanner += BEAM_RETURN_TO_TRACE_FRAME_SZ ;
38943899 }
38953900
3896- scanner += CP_SIZE ;
38973901 }
38983902}
38993903#endif
0 commit comments