Skip to content

Commit 8418e24

Browse files
authored
Bug: LiveDebugger stops working after code reload (#384)
* load modules after code reload * fix tests * add comment * listen to Mix.Tasks.Compile.Elixir for modules load * fix tests * fix pattern match
1 parent 2ac39ff commit 8418e24

2 files changed

Lines changed: 38 additions & 15 deletions

File tree

lib/live_debugger/gen_servers/callback_tracing_server.ex

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,15 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
4747
Dbg.tracer(:process, {&handle_trace/2, 0})
4848
Dbg.p(:all, [:c, :timestamp])
4949

50-
all_modules = ModuleDiscoveryService.all_modules()
51-
52-
callbacks =
53-
all_modules
54-
|> ModuleDiscoveryService.live_view_modules()
55-
|> CallbackUtils.live_view_callbacks()
56-
57-
all_modules
58-
|> ModuleDiscoveryService.live_component_modules()
59-
|> CallbackUtils.live_component_callbacks()
60-
|> Enum.concat(callbacks)
61-
|> Enum.each(fn mfa ->
62-
Dbg.tp(mfa, [{:_, [], [{:return_trace}]}])
63-
Dbg.tp(mfa, [{:_, [], [{:exception_trace}]}])
64-
end)
50+
add_live_modules_to_tracer()
6551

6652
# This is not a callback created by user
6753
# We trace it to refresh the components tree
6854
Dbg.tp({Phoenix.LiveView.Diff, :delete_component, 2}, [])
6955

56+
# We need to get information when code reloads to properly trace modules
57+
Dbg.tp({Mix.Tasks.Compile.Elixir, :run, 1}, [{:_, [], [{:return_trace}]}])
58+
7059
{:noreply, state}
7160
end
7261

@@ -79,6 +68,16 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
7968
# Because of that we do it asynchronously to speed up tracer a bit
8069
# We do not persist this trace because it is not displayed to user
8170
@spec handle_trace(term(), n :: integer()) :: integer()
71+
defp handle_trace({_, _, :return_from, {Mix.Tasks.Compile.Elixir, _, _}, _, _}, n) do
72+
Process.sleep(100)
73+
add_live_modules_to_tracer()
74+
n
75+
end
76+
77+
defp handle_trace({_, _, _, {Mix.Tasks.Compile.Elixir, _, _}, _}, n) do
78+
n
79+
end
80+
8281
defp handle_trace(
8382
{_, pid, _, {Phoenix.LiveView.Diff, :delete_component, [cid | _] = args}, timestamp},
8483
n
@@ -144,6 +143,24 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
144143
n
145144
end
146145

146+
defp add_live_modules_to_tracer() do
147+
all_modules = ModuleDiscoveryService.all_modules()
148+
149+
callbacks =
150+
all_modules
151+
|> ModuleDiscoveryService.live_view_modules()
152+
|> CallbackUtils.live_view_callbacks()
153+
154+
all_modules
155+
|> ModuleDiscoveryService.live_component_modules()
156+
|> CallbackUtils.live_component_callbacks()
157+
|> Enum.concat(callbacks)
158+
|> Enum.each(fn mfa ->
159+
Dbg.tp(mfa, [{:_, [], [{:return_trace}]}])
160+
Dbg.tp(mfa, [{:_, [], [{:exception_trace}]}])
161+
end)
162+
end
163+
147164
@spec persist_trace(Trace.t()) :: :ok | {:error, term()}
148165
defp persist_trace(%Trace{} = trace) do
149166
TraceService.insert(trace)

test/gen_servers/callback_tracing_server_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ defmodule LiveDebugger.GenServers.CallbackTracingServerTest do
5050

5151
MockDbg
5252
|> expect(:tp, fn {Phoenix.LiveView.Diff, :delete_component, 2}, [] -> :ok end)
53+
|> expect(:tp, fn {Mix.Tasks.Compile.Elixir, :run, 1}, [{:_, [], [{:return_trace}]}] ->
54+
:ok
55+
end)
5356

5457
assert {:noreply, %{}} = CallbackTracingServer.handle_info(:setup_tracing, %{})
5558
end
@@ -62,6 +65,9 @@ defmodule LiveDebugger.GenServers.CallbackTracingServerTest do
6265
MockDbg
6366
|> expect(:p, fn :all, [:c, :timestamp] -> :ok end)
6467
|> expect(:tp, fn {Phoenix.LiveView.Diff, :delete_component, 2}, [] -> :ok end)
68+
|> expect(:tp, fn {Mix.Tasks.Compile.Elixir, :run, 1}, [{:_, [], [{:return_trace}]}] ->
69+
:ok
70+
end)
6571

6672
# In order to keep CallbackTracingServer.handle_trace function private we extract it here
6773
# and send to test process so that we can test it

0 commit comments

Comments
 (0)