-module(ides). -moduledoc """ Beware the Ides of March — find the supervisors and siblings that could kill your Erlang process. Given any PID, this module shows: - **Ancestors**: the chain of supervisors above the process - **Siblings**: all children of the same supervisor - **Kill graph**: every process that could cause this PID to be killed - **Restart logic**: whether a terminated child will be restarted - **Affected siblings**: which siblings a supervisor would kill/restart if this PID dies Uses OTP primitives: `erlang:process_info/2` for `$ancestors`, `supervisor:which_children/1`, and `proc_lib:translate_initial_call/1` """. -export([ ancestors/1, format/2, print/2, kill_graph/1, should_restart/2, affected_siblings/1, link_info/1, monitor_info/1, kill_graph_detail/1, format_detail/3, print_detail/3 ]). -type supervisor_strategy() :: ides_family:supervisor_strategy(). -type child_restart_type() :: ides_family:child_restart_type(). -type child_process() :: ides_family:child_process(). -type supervisor_process() :: ides_family:supervisor_process(). -type process() :: ides_family:process(). -type exit_reason() :: ides_march:exit_reason(). -type link_info() :: ides_family:link_info(). -type monitor_info() :: ides_family:monitor_info(). -type kill_source() :: ides_family:kill_source(). -export_type([ process/0, supervisor_process/0, child_process/0, supervisor_strategy/0, child_restart_type/0, exit_reason/0 ]). -spec ancestors(TargetPid :: pid()) -> {ok, process()} | {error, term()}. ancestors(TargetPid) -> ides_family:ancestors(TargetPid). -spec format(TargetPid :: pid(), Tree :: process()) -> iolist(). format(TargetPid, Tree) -> ides_printer:format(TargetPid, Tree). -spec print(TargetPid :: pid(), Tree :: process()) -> ok. print(TargetPid, Tree) -> ides_printer:print(TargetPid, Tree). -spec kill_graph(TargetPid :: pid()) -> {ok, [pid()]} | {error, term()}. kill_graph(TargetPid) -> ides_march:kill_graph(TargetPid). -spec should_restart(Pid :: pid(), Reason :: exit_reason()) -> boolean(). should_restart(Pid, Reason) -> ides_march:should_restart(Pid, Reason). -spec affected_siblings(TargetPid :: pid()) -> {ok, [pid()]} | {error, term()}. affected_siblings(TargetPid) -> ides_march:affected_siblings(TargetPid). %% --- Link and monitor analysis --- -spec link_info(Pid :: pid()) -> {ok, link_info()} | {error, term()}. link_info(Pid) -> ides_march:link_info(Pid). -spec monitor_info(Pid :: pid()) -> {ok, monitor_info()} | {error, term()}. monitor_info(Pid) -> ides_march:monitor_info(Pid). -spec kill_graph_detail(TargetPid :: pid()) -> {ok, [kill_source()]} | {error, term()}. kill_graph_detail(TargetPid) -> ides_march:kill_graph_detail(TargetPid). -spec format_detail(TargetPid :: pid(), Tree :: process(), KillSources :: [kill_source()]) -> iolist(). format_detail(TargetPid, Tree, KillSources) -> ides_printer:format_detail(TargetPid, Tree, KillSources). -spec print_detail(TargetPid :: pid(), Tree :: process(), KillSources :: [kill_source()]) -> ok. print_detail(TargetPid, Tree, KillSources) -> ides_printer:print_detail(TargetPid, Tree, KillSources).