File 0437-dbg-make-simple-tracer-remsh-friendly.patch of Package erlang
From c13718a3a5f8ad7863580b73a91f33735d0b46f9 Mon Sep 17 00:00:00 2001
From: Danil Zagoskin <z@gosk.in>
Date: Thu, 13 Mar 2025 18:51:46 +0300
Subject: [PATCH 1/2] [dbg] make simple tracer() remsh-friendly
`dbg:tracer()` as shown in getting started was printing
everything via local `user` process. This made trace messages
invisible over remsh unless tracer was explicitly configured.
This commit makes default trace use group_leader, making
it less surprising for remsh users.
---
lib/runtime_tools/src/dbg.erl | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/lib/runtime_tools/src/dbg.erl b/lib/runtime_tools/src/dbg.erl
index b1d17dd740..a7784dc6c3 100644
--- a/lib/runtime_tools/src/dbg.erl
+++ b/lib/runtime_tools/src/dbg.erl
@@ -1228,7 +1228,7 @@ To start a similar tracer on a remote node, use `n/1`.
""".
-spec tracer() -> {ok, pid()} | {error, already_started}.
tracer() ->
- tracer(process, {fun dhandler/2,user}).
+ tracer(process, {fun dhandler/2, dhandler_default_out()}).
-doc """
tracer(Type, Data)
@@ -1675,13 +1675,13 @@ The pids will vary.
Filename :: file:name_all(),
WrapFilesSpec :: trace_wrap_files_spec().
trace_client(file, Filename) ->
- trace_client(file, Filename, {fun dhandler/2,user});
+ trace_client(file, Filename, {fun dhandler/2, dhandler_default_out()});
trace_client(follow_file, Filename) ->
- trace_client(follow_file, Filename, {fun dhandler/2,user});
+ trace_client(follow_file, Filename, {fun dhandler/2, dhandler_default_out()});
trace_client(ip, Portno) when is_integer(Portno) ->
- trace_client1(ip, {"localhost", Portno}, {fun dhandler/2,user});
+ trace_client1(ip, {"localhost", Portno}, {fun dhandler/2, dhandler_default_out()});
trace_client(ip, {Host, Portno}) when is_integer(Portno) ->
- trace_client1(ip, {Host, Portno}, {fun dhandler/2,user}).
+ trace_client1(ip, {Host, Portno}, {fun dhandler/2, dhandler_default_out()}).
-type handler_spec() :: {HandlerFun :: fun((Event :: term(), Data :: term()) -> NewData :: term()),
InitialData :: term()}.
@@ -2377,6 +2377,23 @@ do_relay_1(RelP, Session) ->
do_relay_1(RelP, Session)
end.
+-doc false.
+dhandler_default_out() ->
+ %% When user (human) sets up dbg over remsh, group_leader is on other node.
+ %% In this case, pass printed info to the remote group_leader
+ %% so the user (human) can see what's happening
+ {_Key, Ancestors} = process_info(self(), {dictionary, '$ancestors'}),
+ IsShell = (shell:whereis() == hd(Ancestors)),
+ case IsShell andalso (node(group_leader()) /= node()) of
+ true ->
+ % This is an interactive shell AND group_leader is remote
+ % Assume this is remsh and use the remote group_leader
+ group_leader();
+ false ->
+ % On the same node or when not a shell use 'user' (process) as default output
+ user
+ end.
+
-doc false.
dhandler(end_of_trace, Out) ->
Out;
--
2.43.0