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

openSUSE Build Service is sponsored by