File 6771-Add-stacktrace-in-max-heap-size-log.patch of Package erlang
From 05c52ba036137d6fdeb2205d069ec4261cb23cbb Mon Sep 17 00:00:00 2001
From: Zeyu Zhang <zeyu@fb.com>
Date: Fri, 25 Aug 2023 14:21:17 -0700
Subject: [PATCH 1/3] Add stacktrace in max heap size log
This commit externs the current_stacktrace function and use it in erl_gc
when doing max heap event log. This is especially useful when debugging
a process that has been killed by the heap limit.
---
erts/emulator/beam/erl_bif_info.c | 9 +++------
erts/emulator/beam/erl_gc.c | 7 ++++++-
erts/emulator/beam/erl_process.h | 4 ++++
3 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c
index 7deec8f329..2265578f37 100644
--- a/erts/emulator/beam/erl_bif_info.c
+++ b/erts/emulator/beam/erl_bif_info.c
@@ -163,9 +163,6 @@ static char erts_system_version[] = ("Erlang/OTP " ERLANG_OTP_RELEASE
static Eterm
current_function(Process* p, ErtsHeapFactory *hfact, Process* rp,
int full_info, Uint reserve_size, int flags);
-static Eterm
-current_stacktrace(Process* p, ErtsHeapFactory *hfact, Process* rp,
- Uint reserve_size, int flags);
Eterm
erts_bld_bin_list(Uint **hpp, Uint *szp, ErlOffHeap* oh, Eterm tail)
@@ -1506,7 +1503,7 @@ process_info_aux(Process *c_p,
break;
case ERTS_PI_IX_CURRENT_STACKTRACE:
- res = current_stacktrace(c_p, hfact, rp, reserve_size, flags);
+ res = erts_current_stacktrace(c_p, hfact, rp, reserve_size, flags);
break;
case ERTS_PI_IX_INITIAL_CALL:
@@ -2214,8 +2211,8 @@ current_function(Process *c_p, ErtsHeapFactory *hfact, Process* rp,
return res;
}
-static Eterm
-current_stacktrace(Process *p, ErtsHeapFactory *hfact, Process* rp,
+Eterm
+erts_current_stacktrace(Process *p, ErtsHeapFactory *hfact, Process* rp,
Uint reserve_size, int flags)
{
Uint sz;
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c
index 4b41d87ad5..578143e685 100644
--- a/erts/emulator/beam/erl_gc.c
+++ b/erts/emulator/beam/erl_gc.c
@@ -3725,6 +3725,7 @@ reached_max_heap_size(Process *p, Uint total_heap_size,
int alive = erts_is_alive;
erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf();
Eterm *o_hp, *hp, args = NIL;
+ ErtsHeapFactory hfact;
/* Build the format message */
erts_dsprintf(dsbufp, " Process: ~p ");
@@ -3737,9 +3738,13 @@ reached_max_heap_size(Process *p, Uint total_heap_size,
erts_dsprintf(dsbufp, " Error Logger: ~p~n");
erts_dsprintf(dsbufp, " Message Queue Len: ~p~n");
erts_dsprintf(dsbufp, " GC Info: ~p~n");
+ erts_dsprintf(dsbufp, " Stacktrace: ~p~n");
/* Build the args in reverse order */
- o_hp = hp = erts_alloc(ERTS_ALC_T_TMP, 2*(alive ? 8 : 7) * sizeof(Eterm));
+ o_hp = hp = erts_alloc(ERTS_ALC_T_TMP, 2*(alive ? 9 : 8) * sizeof(Eterm));
+ erts_factory_proc_init(&hfact, p);
+ args = CONS(hp, erts_current_stacktrace(p, &hfact, p, 0 ,0), args); hp += 2;
+ erts_factory_close(&hfact);
args = CONS(hp, msg, args); hp += 2;
args = CONS(hp, make_small((p)->sig_inq.len), args); hp += 2;
args = CONS(hp, am_true, args); hp += 2;
diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h
index cbd6634c4a..f2bc7ad94f 100644
--- a/erts/emulator/beam/erl_process.h
+++ b/erts/emulator/beam/erl_process.h
@@ -2940,3 +2940,7 @@ float erts_sched_local_random_float(Uint additional_seed)
void erts_halt(int code);
extern erts_atomic32_t erts_halt_progress;
extern int erts_halt_code;
+
+extern Eterm
+erts_current_stacktrace(Process* p, ErtsHeapFactory *hfact, Process* rp,
+ Uint reserve_size, int flags);
--
2.35.3