@@ -45,7 +45,7 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
4545 @ impl true
4646 def handle_info ( :setup_tracing , state ) do
4747 Dbg . tracer ( :process , { & handle_trace / 2 , 0 } )
48- Dbg . p ( :all , :c )
48+ Dbg . p ( :all , [ :c , :timestamp ] )
4949
5050 all_modules = ModuleDiscoveryService . all_modules ( )
5151
@@ -58,7 +58,10 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
5858 |> ModuleDiscoveryService . live_component_modules ( )
5959 |> CallbackUtils . live_component_callbacks ( )
6060 |> Enum . concat ( callbacks )
61- |> Enum . each ( fn mfa -> Dbg . tp ( mfa , [ ] ) end )
61+ |> Enum . each ( fn mfa ->
62+ Dbg . tp ( mfa , [ { :_ , [ ] , [ { :return_trace } ] } ] )
63+ Dbg . tp ( mfa , [ { :_ , [ ] , [ { :exception_trace } ] } ] )
64+ end )
6265
6366 # This is not a callback created by user
6467 # We trace it to refresh the components tree
@@ -76,7 +79,10 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
7679 # Because of that we do it asynchronously to speed up tracer a bit
7780 # We do not persist this trace because it is not displayed to user
7881 @ spec handle_trace ( term ( ) , n :: integer ( ) ) :: integer ( )
79- defp handle_trace ( { _ , pid , _ , { Phoenix.LiveView.Diff , :delete_component , [ cid | _ ] = args } } , n ) do
82+ defp handle_trace (
83+ { _ , pid , _ , { Phoenix.LiveView.Diff , :delete_component , [ cid | _ ] = args } , timestamp } ,
84+ n
85+ ) do
8086 Task . start ( fn ->
8187 with cid <- % Phoenix.LiveComponent.CID { cid: cid } ,
8288 { :ok , % { socket: socket } } <- ChannelService . state ( pid ) ,
@@ -89,6 +95,7 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
8995 :delete_component ,
9096 args ,
9197 pid ,
98+ timestamp ,
9299 socket_id: socket_id ,
93100 transport_pid: transport_pid ,
94101 cid: cid
@@ -102,16 +109,36 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
102109
103110 # This handles callbacks created by user that will be displayed to user
104111 # It cannot be async because we care about order
105- defp handle_trace ( { _ , pid , _ , { module , fun , args } } , n ) when fun in @ callback_functions do
106- with trace <- Trace . new ( n , module , fun , args , pid ) ,
112+ defp handle_trace ( { _ , pid , :call , { module , fun , args } , timestamp } , n )
113+ when fun in @ callback_functions do
114+ with trace <- Trace . new ( n , module , fun , args , pid , timestamp ) ,
107115 true <- is_pid ( trace . transport_pid ) ,
108116 :ok <- persist_trace ( trace ) do
117+ :erlang . put ( { pid , module , fun } , { timestamp , trace } )
109118 publish_trace ( trace )
110119 end
111120
112121 n - 1
113122 end
114123
124+ defp handle_trace ( { _ , pid , :return_from , { module , fun , _arity } , _ , return_ts } , n )
125+ when fun in @ callback_functions do
126+ with { call_ts , trace } <- :erlang . get ( { pid , module , fun } ) ,
127+ execution_time <- :timer . now_diff ( return_ts , call_ts ) ,
128+ trace <- % { trace | execution_time: execution_time } ,
129+ :ok <- persist_trace ( trace ) do
130+ :erlang . erase ( { pid , module , fun } )
131+ publish_update_trace ( trace )
132+ end
133+
134+ n
135+ end
136+
137+ defp handle_trace ( { _ , _pid , :exception_from , { _module , fun , _ } , _ , _timestamp } , n )
138+ when fun in @ callback_functions do
139+ n
140+ end
141+
115142 defp handle_trace ( trace , n ) do
116143 Logger . info ( "Ignoring unexpected trace: #{ inspect ( trace ) } " )
117144 n
@@ -138,6 +165,16 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
138165 { :error , err }
139166 end
140167
168+ @ spec publish_update_trace ( Trace . t ( ) ) :: :ok | { :error , term ( ) }
169+ defp publish_update_trace ( % Trace { } = trace ) do
170+ do_publish_update ( trace )
171+ :ok
172+ rescue
173+ err ->
174+ Logger . error ( "Error while publishing trace: #{ inspect ( err ) } " )
175+ { :error , err }
176+ end
177+
141178 @ spec do_publish ( Trace . t ( ) ) :: :ok
142179 defp do_publish ( % { module: Phoenix.LiveView.Diff } = trace ) do
143180 trace
@@ -152,11 +189,23 @@ defmodule LiveDebugger.GenServers.CallbackTracingServer do
152189 fun = trace . function
153190
154191 socket_id
155- |> PubSubUtils . tsnf_topic ( transport_pid , node_id , fun )
192+ |> PubSubUtils . tsnf_topic ( transport_pid , node_id , fun , :call )
156193 |> PubSubUtils . broadcast ( { :new_trace , trace } )
157194
158195 socket_id
159196 |> PubSubUtils . ts_f_topic ( transport_pid , fun )
160197 |> PubSubUtils . broadcast ( { :new_trace , trace } )
161198 end
199+
200+ @ spec do_publish_update ( Trace . t ( ) ) :: :ok
201+ defp do_publish_update ( trace ) do
202+ socket_id = trace . socket_id
203+ node_id = Trace . node_id ( trace )
204+ transport_pid = trace . transport_pid
205+ fun = trace . function
206+
207+ socket_id
208+ |> PubSubUtils . tsnf_topic ( transport_pid , node_id , fun , :return )
209+ |> PubSubUtils . broadcast ( { :updated_trace , trace } )
210+ end
162211end
0 commit comments