diff options
author | Björn-Egil Dahlberg <[email protected]> | 2015-05-12 12:08:02 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2015-05-12 12:08:02 +0200 |
commit | 996380765561b1a0e3d215437d4560d2e7a72cfb (patch) | |
tree | 9fdf6fbf8f74014e1142183c0f5c7bad68893ac9 /erts/emulator/beam/beam_emu.c | |
parent | 3d894779f950a6ce2a97f3678e1492d1926836b1 (diff) | |
parent | 5917fd5468a952fce7ebda8b57a6218fbb7bb878 (diff) | |
download | otp-996380765561b1a0e3d215437d4560d2e7a72cfb.tar.gz otp-996380765561b1a0e3d215437d4560d2e7a72cfb.tar.bz2 otp-996380765561b1a0e3d215437d4560d2e7a72cfb.zip |
Merge branch 'jv/18/emulator-send-to-error_logger/OTP-12735'
* jv/18/emulator-send-to-error_logger/OTP-12735:
erts: Fix erts_send_error_term_to_logger memory leak
Send format and args on process exit to error_logger
Add erts_send_error_term_to_logger
Diffstat (limited to 'erts/emulator/beam/beam_emu.c')
-rw-r--r-- | erts/emulator/beam/beam_emu.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index 9fe02c3724..a21622f424 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -5577,18 +5577,35 @@ next_catch(Process* c_p, Eterm *reg) { static void terminate_proc(Process* c_p, Eterm Value) { + Eterm *hp; + Eterm Args = NIL; + /* Add a stacktrace if this is an error. */ if (GET_EXC_CLASS(c_p->freason) == EXTAG_ERROR) { Value = add_stacktrace(c_p, Value, c_p->ftrace); } /* EXF_LOG is a primary exception flag */ if (c_p->freason & EXF_LOG) { + int alive = erts_is_alive; erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf(); - erts_dsprintf(dsbufp, "Error in process %T ", c_p->common.id); - if (erts_is_alive) - erts_dsprintf(dsbufp, "on node %T ", erts_this_node->sysname); - erts_dsprintf(dsbufp,"with exit value: %0.*T\n", display_items, Value); - erts_send_error_to_logger(c_p->group_leader, dsbufp); + + /* Build the format message */ + erts_dsprintf(dsbufp, "Error in process ~p "); + if (alive) + erts_dsprintf(dsbufp, "on node ~p "); + erts_dsprintf(dsbufp, "with exit value:~n~p~n"); + + /* Build the args in reverse order */ + hp = HAlloc(c_p, 2); + Args = CONS(hp, Value, Args); + if (alive) { + hp = HAlloc(c_p, 2); + Args = CONS(hp, erts_this_node->sysname, Args); + } + hp = HAlloc(c_p, 2); + Args = CONS(hp, c_p->common.id, Args); + + erts_send_error_term_to_logger(c_p->group_leader, dsbufp, Args); } /* * If we use a shared heap, the process will be garbage-collected. |