Skip to content

Commit a9ec63a

Browse files
committed
change tracing pattern when setting changes
1 parent d8def51 commit a9ec63a

File tree

4 files changed

+54
-7
lines changed

4 files changed

+54
-7
lines changed

lib/live_debugger/gen_servers/callback_tracing_server.ex

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
77

88
require Logger
99

10+
alias LiveDebugger.GenServers.SettingsServer
1011
alias LiveDebugger.Services.System.DbgService, as: Dbg
1112
alias LiveDebugger.Services.ModuleDiscoveryService
1213
alias LiveDebugger.Services.ChannelService
@@ -49,6 +50,10 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
4950
Dbg.tp(mfa, [{:_, [], [{:exception_trace}]}])
5051
end)
5152

53+
if SettingsServer.get(:tracing_update_on_code_reload) do
54+
add_code_reload_tracing()
55+
end
56+
5257
:ok
5358
end
5459

@@ -67,6 +72,11 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
6772
{:ok, %{}}
6873
end
6974

75+
@impl true
76+
def handle_call(:ping, _from, state) do
77+
{:reply, :ok, state}
78+
end
79+
7080
@impl true
7181
def handle_info(:setup_tracing, state) do
7282
Dbg.tracer(:process, {&handle_trace/2, 0})
@@ -78,19 +88,25 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
7888
# We trace it to refresh the components tree
7989
Dbg.tp({Phoenix.LiveView.Diff, :delete_component, 2}, [])
8090

81-
if Application.get_env(:live_debugger, :tracing_update_on_code_reload?, false) do
82-
# We need to get information when code reloads to properly trace modules
83-
Dbg.tp({Mix.Tasks.Compile.Elixir, :run, 1}, [{:_, [], [{:return_trace}]}])
84-
end
91+
PubSubUtils.setting_changed()
92+
|> PubSubUtils.subscribe!()
8593

8694
{:noreply, state}
8795
end
8896

89-
@impl true
90-
def handle_call(:ping, _from, state) do
91-
{:reply, :ok, state}
97+
def handle_info({:setting_changed, :tracing_update_on_code_reload, reload?}, state)
98+
when is_boolean(reload?) do
99+
if reload? do
100+
add_code_reload_tracing()
101+
else
102+
remove_code_reload_tracing()
103+
end
104+
105+
{:noreply, state}
92106
end
93107

108+
def handle_info(_, state), do: {:noreply, state}
109+
94110
@spec handle_trace(term(), n :: integer()) :: integer()
95111
defp handle_trace({_, _, :return_from, {Mix.Tasks.Compile.Elixir, _, _}, {:ok, _}, _}, n) do
96112
Process.sleep(100)
@@ -245,4 +261,12 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
245261
|> PubSubUtils.trace_topic_per_pid(fun, :return)
246262
|> PubSubUtils.broadcast({:updated_trace, trace})
247263
end
264+
265+
defp add_code_reload_tracing() do
266+
Dbg.tp({Mix.Tasks.Compile.Elixir, :run, 1}, [{:_, [], [{:return_trace}]}])
267+
end
268+
269+
defp remove_code_reload_tracing() do
270+
Dbg.ctp({Mix.Tasks.Compile.Elixir, :run, 1}, [{:_, [], [{:return_trace}]}])
271+
end
248272
end

lib/live_debugger/gen_servers/settings_server.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ defmodule LiveDebugger.GenServers.SettingsServer do
1010

1111
@settings [:dead_view_mode, :tracing_update_on_code_reload]
1212

13+
alias LiveDebugger.Utils.PubSub, as: PubSubUtils
14+
1315
## API
1416

1517
@spec get(setting :: atom()) :: term()
@@ -64,6 +66,9 @@ defmodule LiveDebugger.GenServers.SettingsServer do
6466
def handle_cast({:save, setting, value}, state) do
6567
save_in_dets(setting, value)
6668

69+
PubSubUtils.setting_changed()
70+
|> PubSubUtils.broadcast({:setting_changed, setting, value})
71+
6772
{:noreply, Map.put(state, setting, value)}
6873
end
6974

lib/live_debugger/services/system/dbg_service.ex

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ defmodule LiveDebugger.Services.System.DbgService do
2222

2323
@callback tp(module() | mfa(), match_spec :: term()) :: {:ok, match_desc()} | {:error, term()}
2424

25+
@callback ctp(module() | mfa(), match_spec :: term()) :: {:ok, match_desc()} | {:error, term()}
26+
2527
@doc """
2628
Wrapper for `:dbg.tracer/2` that starts a tracer for the given type and handler specification.
2729
"""
@@ -46,6 +48,12 @@ defmodule LiveDebugger.Services.System.DbgService do
4648
@spec tp(module() | mfa(), match_spec :: term()) :: {:ok, match_desc()} | {:error, term()}
4749
def tp(module, match_spec), do: impl().tp(module, match_spec)
4850

51+
@doc """
52+
Wrapper for `:dbg.ctp/2` that ends tracing for given pattern
53+
"""
54+
@spec ctp(module() | mfa(), match_spec :: term()) :: {:ok, match_desc()} | {:error, term()}
55+
def ctp(module, match_spec), do: impl().ctp(module, match_spec)
56+
4957
defp impl() do
5058
Application.get_env(
5159
:live_debugger,
@@ -72,5 +80,10 @@ defmodule LiveDebugger.Services.System.DbgService do
7280
def tp(module, match_spec) do
7381
:dbg.tp(module, match_spec)
7482
end
83+
84+
@impl true
85+
def ctp(module, match_spec) do
86+
:dbg.ctp(module, match_spec)
87+
end
7588
end
7689
end

lib/live_debugger/utils/pubsub.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ defmodule LiveDebugger.Utils.PubSub do
2626
@spec unsubscribe(topic :: String.t()) :: :ok
2727
def unsubscribe(topic), do: impl().unsubscribe(topic)
2828

29+
@spec setting_changed() :: String.t()
30+
def setting_changed() do
31+
"lvdbg/setting_changed"
32+
end
33+
2934
@doc "Use `{:component_deleted, delete_trace}` for broadcasting"
3035
@spec component_deleted_topic() :: String.t()
3136
def component_deleted_topic() do

0 commit comments

Comments
 (0)