查看源代码 int (调试器 v5.5)

解释器接口。

Erlang 解释器提供了断点和代码逐步执行的机制。它主要供调试器使用;请参阅调试器用户指南和模块debugger

可以从 shell 执行以下操作

  • 指定要解释的模块。
  • 指定断点。
  • 监视在解释模块中执行代码的所有进程的当前状态,以及其他 Erlang 节点上的进程。

通过附加到执行解释代码的进程,可以检查变量绑定并逐步执行代码。这是通过第三个进程(称为元进程)向/从进程发送和接收信息来完成的。您可以实现自己的附加进程。请参阅int.erl了解可用的函数,并参阅dbg_wx_trace.erl了解可能的消息。

解释器依赖于 Kernel、STDLIB 和 WX 应用程序。这意味着不允许解释属于这些应用程序的模块,因为它可能导致死锁或模拟器崩溃。这也适用于属于调试器应用程序的模块。

断点

断点是在行的基础上指定的。当在解释模块中执行代码的进程到达断点时,它会停止。这意味着断点必须设置在可执行行上,即可执行表达式的代码行。

断点具有以下内容

  • 一个状态,即活动非活动。非活动断点将被忽略。
  • 一个触发动作。当到达断点时,触发动作指定断点是继续处于活动状态(启用),还是变为非活动状态(禁用),还是被删除(删除)。
  • 可选地,关联的条件。条件是一个元组{Module,Name}。当到达断点时,调用Module:Name(Bindings)。如果它评估为true,则执行停止。如果它评估为false,则忽略断点。Bindings包含当前的变量绑定。要检索指定变量的值,请使用get_binding/2

默认情况下,断点处于活动状态,具有触发动作enable,并且没有关联的条件。有关断点的详细信息,请参阅调试器用户指南中的断点和断点对话框窗口

摘要

函数

ModuleLine处的断点的触发动作设置为Action

获取所有断点。

获取模块Module中的所有断点。

获取如何自动附加到在解释模块中执行代码的进程。

禁用自动附加。

设置何时以及如何自动附加到在解释模块中执行代码的进程。

ModuleLine处创建一个断点。

在函数Module:Name/Arity的每个子句的第一行创建一个断点。

通过删除有关已终止进程的所有信息来清除有关执行解释代码的进程的信息。

恢复Pid的进程执行。

恢复c:pid(X, Y, Z)的进程执行。

删除函数Module:Name/Arity的每个子句的第一行的断点。

删除ModuleLine处的断点。

使ModuleLine处的断点处于非活动状态。

使ModuleLine处的断点处于活动状态。

返回解释模块Module的源代码文件名File

Bindings检索Var的绑定。

在本地节点上解释指定的模块。

检查模块是否可以解释。

返回包含所有已解释模块的列表。

停止在本地节点上解释指定的模块。

在所有已知节点上解释指定的模块。

停止在所有已知节点上解释指定的模块。

删除所有断点。

删除Module中的所有断点。

获取有关所有执行解释代码的进程的信息。

获取如何在堆栈中保存调用帧。

设置如何在堆栈中保存调用帧。

ModuleLine处的断点的条件测试设置为Function

函数

链接到此函数

action_at_break(Module, Line, Action)

查看源代码
-spec action_at_break(Module, Line, Action) -> ok
                         when Module :: module(), Line :: integer(), Action :: enable | disable | delete.

ModuleLine处的断点的触发动作设置为Action

-spec all_breaks() -> [Break]
                    when
                        Break :: {Point, Options},
                        Point :: {Module, Line},
                        Module :: module(),
                        Line :: integer(),
                        Options :: [Status | Trigger | null | Cond],
                        Status :: active | inactive,
                        Trigger :: enable | disable | delete,
                        Cond :: null | Function,
                        Function :: {Module, Name},
                        Name :: atom().

获取所有断点。

-spec all_breaks(Module) -> [Break]
                    when
                        Break :: {Point, Options},
                        Point :: {Module, Line},
                        Module :: module(),
                        Line :: integer(),
                        Options :: [Status | Trigger | null | Cond],
                        Status :: active | inactive,
                        Trigger :: enable | disable | delete,
                        Cond :: null | Function,
                        Function :: {Module, Name},
                        Name :: atom().

获取模块Module中的所有断点。

-spec auto_attach() -> false | {Flags, Function}
                     when
                         Flags :: [init | break | exit],
                         Function :: {Module, Name, Args},
                         Module :: module(),
                         Name :: atom(),
                         Args :: [term()].

获取如何自动附加到在解释模块中执行代码的进程。

有关Flags中可能值的含义,请参阅auto_attach/2

-spec auto_attach(false) -> term().

禁用自动附加。

链接到此函数

auto_attach(Flags, Function)

查看源代码
-spec auto_attach(Flags, Function) -> term()
                     when
                         Flags :: [init | break | exit],
                         Function :: {Module, Name, Args},
                         Module :: module(),
                         Name :: atom(),
                         Args :: [term()].

设置何时以及如何自动附加到在解释模块中执行代码的进程。

默认情况下,当解释器启动时,自动附加处于禁用状态。

如果Flags是一个空列表,则自动附加处于禁用状态。

否则,Flags应为包含以下至少一个标志的列表

  • init - 当进程第一次调用解释函数时附加。
  • break - 每当进程到达断点时附加。
  • exit - 当进程终止时附加。

当指定的事件发生时,将调用函数Function,如下所示

spawn(Module, Name, [Pid | Args])

Pid是执行解释代码的进程的 pid。

-spec break(Module, Line) -> ok | {error, break_exists} when Module :: module(), Line :: integer().

ModuleLine处创建一个断点。

链接到此函数

break_in(Module, Name, Arity)

查看源代码
-spec break_in(Module, Name, Arity) -> ok | {error, function_not_found}
                  when Module :: module(), Name :: atom(), Arity :: integer().

在函数Module:Name/Arity的每个子句的第一行创建一个断点。

-spec clear() -> ok.

通过删除有关已终止进程的所有信息来清除有关执行解释代码的进程的信息。

-spec continue(Pid :: pid()) -> ok | {error, not_interpreted}.

恢复Pid的进程执行。

-spec continue(X, Y, Z) -> ok | {error, not_interpreted}
                  when X :: integer(), Y :: integer(), Z :: integer().

恢复c:pid(X, Y, Z)的进程执行。

链接到此函数

del_break_in(Module, Name, Arity)

查看源代码
-spec del_break_in(Module, Name, Arity) -> ok | {error, function_not_found}
                      when Module :: module(), Name :: atom(), Arity :: integer().

删除函数Module:Name/Arity的每个子句的第一行的断点。

链接到此函数

delete_break(Module, Line)

查看源代码
-spec delete_break(Module, Line) -> ok when Module :: module(), Line :: integer().

删除ModuleLine处的断点。

链接到此函数

disable_break(Module, Line)

查看源代码
-spec disable_break(Module, Line) -> ok when Module :: module(), Line :: integer().

使ModuleLine处的断点处于非活动状态。

链接到此函数

enable_break(Module, Line)

查看源代码
-spec enable_break(Module, Line) -> ok when Module :: module(), Line :: integer().

使ModuleLine处的断点处于活动状态。

-spec file(Module) -> File | {error, not_loaded} when Module :: module(), File :: file:filename_all().

返回解释模块Module的源代码文件名File

链接到此函数

get_binding(Var, Bindings)

查看源代码
-spec get_binding(Var, Bindings) -> {value, Value} | unbound
                     when Var :: atom(), Bindings :: term(), Value :: term().

Bindings检索Var的绑定。

此函数旨在由断点的条件函数使用。

-spec i(AbsModules | AbsModule) -> Result
           when
               AbsModules :: [AbsModule, ...],
               AbsModule :: Module | File,
               Module :: module(),
               File :: file:name_all(),
               Result :: AbsModuleResult | AbsModulesResult,
               AbsModuleResult :: {module, Module} | error,
               AbsModulesResult :: ok.

在本地节点上解释指定的模块。

模块可以通过其模块名称(原子)或文件名指定。

如果通过其模块名称指定,则在当前路径中搜索对象代码Module.beam。首先在与对象代码相同的目录中搜索源代码Module.erl,然后在旁边的src目录中搜索。

如果通过其文件名指定,则文件名可以包含路径,并且可以省略.erl扩展名。首先在与源代码相同的目录中搜索对象代码Module.beam,然后在旁边的ebin目录中搜索,然后在当前路径中搜索。

注意

解释器需要源代码和对象代码。对象代码必须包含调试信息,即只有使用选项debug_info编译的模块才能被解释。

如果模块被解释,则函数返回{module,Module},否则返回error

该参数也可以是模块或文件名的列表,在这种情况下,该函数会尝试按先前指定的方式解释每个模块。然后,该函数始终返回ok,但如果无法解释模块,则会将一些信息打印到stdout

链接到此函数

interpretable(AbsModule)

查看源代码
-spec interpretable(AbsModule) -> true | {error, Reason}
                       when
                           AbsModule :: Module | File,
                           Module :: module(),
                           File :: file:name_all(),
                           Reason :: no_src | no_beam | no_debug_info | badarg | {app, App},
                           App :: atom().

检查模块是否可以解释。

模块可以通过其模块名称Module或其源文件名File指定。如果通过模块名称指定,则会在代码路径中搜索该模块。

如果以下所有条件均成立,则该函数返回true

  • 找到该模块的源代码和对象代码。
  • 该模块已使用选项debug_info设置进行编译。
  • 该模块不属于任何应用程序 Kernel、STDLIB、WX 或 Debugger。

如果无法解释模块,则该函数返回{error,Reason}Reason可以具有以下值

  • no_src - 未找到源代码。假定源代码和对象代码位于同一目录中,或位于彼此相邻的srcebin目录中。

  • no_beam - 未找到对象代码。假定源代码和对象代码位于同一目录中,或位于彼此相邻的srcebin目录中。

  • no_debug_info - 该模块未使用选项debug_info设置进行编译。

  • badarg - 未找到AbsModule。这可能是因为指定的文件不存在,或者因为code:which/1未返回 BEAM 文件名,这不仅对于不存在的模块是这种情况,而且对于预加载或覆盖编译的模块也是如此。

  • {app,App} - 如果AbsModule属于这些应用程序之一,则Appkernelstdlibgsdebugger

请注意,对于标记为粘性的模块或位于标记为粘性的目录中的模块,该函数可以返回true。原因是只有当解释器尝试加载模块时才会发现这一点。

-spec interpreted() -> [Module] when Module :: module().

返回包含所有已解释模块的列表。

-spec n(AbsModule) -> ok
           when
               AbsModule :: Module | File | [Module | File], Module :: module(), File :: file:name_all().

停止在本地节点上解释指定的模块。

i/1ni/1类似,模块可以通过其模块名称或文件名指定。

-spec ni(AbsModules | AbsModule) -> Result
            when
                AbsModules :: [AbsModule],
                AbsModule :: Module | File,
                Module :: module(),
                File :: file:name_all(),
                Result :: AbsModuleResult | AbsModulesResult,
                AbsModuleResult :: {module, Module} | error,
                AbsModulesResult :: ok.

在所有已知节点上解释指定的模块。

模块可以通过其模块名称(原子)或文件名指定。

如果通过其模块名称指定,则在当前路径中搜索对象代码Module.beam。首先在与对象代码相同的目录中搜索源代码Module.erl,然后在旁边的src目录中搜索。

如果通过其文件名指定,则文件名可以包含路径,并且可以省略.erl扩展名。首先在与源代码相同的目录中搜索对象代码Module.beam,然后在旁边的ebin目录中搜索,然后在当前路径中搜索。

注意

解释器需要源代码和对象代码。对象代码必须包含调试信息,即只有使用选项debug_info编译的模块才能被解释。

如果模块被解释,则函数返回{module,Module},否则返回error

该参数也可以是模块或文件名的列表,在这种情况下,该函数会尝试按先前指定的方式解释每个模块。然后,该函数始终返回ok,但如果无法解释模块,则会将一些信息打印到stdout

-spec nn(AbsModule) -> ok
            when
                AbsModule :: Module | File | [Module | File],
                Module :: module(),
                File :: file:name_all().

停止在所有已知节点上解释指定的模块。

i/1ni/1类似,模块可以通过其模块名称或文件名指定。

-spec no_break() -> ok.

删除所有断点。

-spec no_break(Module :: term()) -> ok.

删除Module中的所有断点。

-spec snapshot() -> [Snapshot]
                  when
                      Snapshot :: {Pid, Function, Status, Info},
                      Pid :: pid(),
                      Function :: {Module, Name, Args},
                      Module :: module(),
                      Name :: atom(),
                      Args :: [term()],
                      Status :: idle | running | waiting | break | exit | no_conn,
                      Info :: {} | {Module, Line} | ExitReason,
                      Line :: integer(),
                      ExitReason :: term().

获取有关所有执行解释代码的进程的信息。

  • Pid - 进程标识符。
  • Function - 进程调用的第一个解释函数。
  • Status - 进程的当前状态。
  • Info - 更多信息。

Status是以下之一

  • idle - 进程不再执行解释代码。Info{}
  • running - 进程正在运行。Info{}
  • waiting - 进程正在等待 receiveInfo{}
  • break - 进程执行已停止,通常是在断点处。Info{Module,Line}
  • exit - 进程已终止。InfoExitReason
  • no_conn - 与进程正在运行的节点的连接已断开。Info{}
-spec stack_trace() -> Flag when Flag :: all | no_tail | false.

获取如何在堆栈中保存调用帧。

有关 Flag 的含义,请参阅 stack_trace/1

-spec stack_trace(Flag) -> term() when Flag :: all | no_tail | false.

设置如何在堆栈中保存调用帧。

保存调用帧可以检查进程的调用链,并且还用于模拟发生错误(错误类的异常)时的堆栈跟踪。可以指定以下标志

  • all - 保存所有当前调用的信息,即尚未返回值的函数调用。

  • no_tail - 保存当前调用的信息,但在进行尾递归调用时丢弃以前的信息。此选项消耗较少的内存,对于具有较长生命周期和许多尾递归调用的进程来说,可能需要使用此选项。这是默认设置。

  • false - 不保存有关当前调用的信息。

链接到此函数

test_at_break(Module, Line, Function)

查看源代码
-spec test_at_break(Module, Line, Function) -> ok
                       when
                           Module :: module(),
                           Line :: integer(),
                           Function :: {Module, Name},
                           Name :: atom().

ModuleLine处的断点的条件测试设置为Function

函数 Function 必须满足断点部分中指定的的要求。