Skip to content

Instantly share code, notes, and snippets.

@venkatd
Last active September 8, 2024 18:56
Show Gist options
  • Save venkatd/859dedbbbac55213335e4784f07b4368 to your computer and use it in GitHub Desktop.
Save venkatd/859dedbbbac55213335e4784f07b4368 to your computer and use it in GitHub Desktop.

Debugger

import Codex.KinoHelpers

Section

{:ok, pid} = Entrace.start_link()
Entrace.trace_cluster(pid, {Play, :add, 2}, &IO.inspect/1)
# this was not working
Codex.KinoHelpers.trace({Play, :add, 2})
{:ok, pid} = Entrace.start_link()
Entrace.trace_cluster(pid, {Play, :add, 2}, &IO.inspect/1)
defmodule Codex.KinoHelpers do
def trace(mfa) do
{:ok, tracer} = Entrace.start_link()
trace_frame = Kino.Frame.new()
trace(tracer, trace_frame, mfa)
trace_frame
end
def trace(tracer, trace_frame, mfa) do
Entrace.stop(tracer, mfa)
Entrace.trace(tracer, mfa, fn %Entrace.Trace{} = t ->
IO.inspect(t)
{_mod, _fun, args} = t.mfa
[stack_item | _rest] = t.stacktrace
columns = [
Kino.Text.new(format_stacktrace_item(stack_item)),
Kino.Tree.new(args)
]
columns =
if t.returned_at != nil do
{:return, ret} = t.return_value
columns ++ [format_return(ret)]
else
columns
end
stack =
for {mod, fun, arity, [file: _file, line: _line]} <- t.stacktrace do
[func: format_mfa({mod, fun, arity})]
end
Kino.Frame.append(
trace_frame,
Kino.Layout.tabs(
Summary: Kino.Layout.grid(columns, columns: Enum.count(columns)),
Stacktrace: Kino.DataTable.new(stack)
)
)
end)
end
def format_stacktrace_item({:elixir, :eval_external_handler, _, _}) do
"(eval)"
end
def format_stacktrace_item({mod, fun, arity, [file: file, line: line]}) do
format_mfa({mod, fun, arity}) <> " " <> "#{file}:#{line}"
end
def format_mfa({mod, fun, arity}) do
"Elixir." <> mod_name = Atom.to_string(mod)
"&#{mod_name}.#{fun}/#{arity}"
end
def format_mfa(bad_mfa) do
inspect(bad_mfa)
end
defp format_return(v) when is_binary(v) or is_number(v) or is_atom(v) do
Kino.Inspect.new(v)
end
defp format_return(v) do
Kino.Tree.new(v)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment