查看源代码 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
,并且没有关联的条件。有关断点的详细信息,请参阅调试器用户指南中的断点和断点对话框窗口。
摘要
函数
将Module
中Line
处的断点的触发动作设置为Action
。
获取所有断点。
获取模块Module
中的所有断点。
获取如何自动附加到在解释模块中执行代码的进程。
禁用自动附加。
设置何时以及如何自动附加到在解释模块中执行代码的进程。
在Module
中Line
处创建一个断点。
在函数Module:Name/Arity
的每个子句的第一行创建一个断点。
通过删除有关已终止进程的所有信息来清除有关执行解释代码的进程的信息。
恢复Pid
的进程执行。
恢复c:pid(X, Y, Z)
的进程执行。
删除函数Module:Name/Arity
的每个子句的第一行的断点。
删除Module
中Line
处的断点。
使Module
中Line
处的断点处于非活动状态。
使Module
中Line
处的断点处于活动状态。
返回解释模块Module
的源代码文件名File
。
从Bindings
检索Var
的绑定。
在本地节点上解释指定的模块。
检查模块是否可以解释。
返回包含所有已解释模块的列表。
停止在本地节点上解释指定的模块。
在所有已知节点上解释指定的模块。
停止在所有已知节点上解释指定的模块。
删除所有断点。
删除Module
中的所有断点。
获取有关所有执行解释代码的进程的信息。
获取如何在堆栈中保存调用帧。
设置如何在堆栈中保存调用帧。
将Module
中Line
处的断点的条件测试设置为Function
。
函数
-spec action_at_break(Module, Line, Action) -> ok when Module :: module(), Line :: integer(), Action :: enable | disable | delete.
将Module
中Line
处的断点的触发动作设置为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().
禁用自动附加。
-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。
在Module
中Line
处创建一个断点。
-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)
的进程执行。
-spec del_break_in(Module, Name, Arity) -> ok | {error, function_not_found} when Module :: module(), Name :: atom(), Arity :: integer().
删除函数Module:Name/Arity
的每个子句的第一行的断点。
删除Module
中Line
处的断点。
使Module
中Line
处的断点处于非活动状态。
使Module
中Line
处的断点处于活动状态。
-spec file(Module) -> File | {error, not_loaded} when Module :: module(), File :: file:filename_all().
返回解释模块Module
的源代码文件名File
。
-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
。
-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
- 未找到源代码。假定源代码和对象代码位于同一目录中,或位于彼此相邻的src
和ebin
目录中。no_beam
- 未找到对象代码。假定源代码和对象代码位于同一目录中,或位于彼此相邻的src
和ebin
目录中。no_debug_info
- 该模块未使用选项debug_info
设置进行编译。badarg
- 未找到AbsModule
。这可能是因为指定的文件不存在,或者因为code:which/1
未返回 BEAM 文件名,这不仅对于不存在的模块是这种情况,而且对于预加载或覆盖编译的模块也是如此。{app,App}
- 如果AbsModule
属于这些应用程序之一,则App
为kernel
、stdlib
、gs
或debugger
。
请注意,对于标记为粘性的模块或位于标记为粘性的目录中的模块,该函数可以返回true
。原因是只有当解释器尝试加载模块时才会发现这一点。
-spec interpreted() -> [Module] when Module :: module().
返回包含所有已解释模块的列表。
-spec n(AbsModule) -> ok when AbsModule :: Module | File | [Module | File], Module :: module(), File :: file:name_all().
停止在本地节点上解释指定的模块。
-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().
停止在所有已知节点上解释指定的模块。
-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
- 进程正在等待receive
。Info
为{}
。break
- 进程执行已停止,通常是在断点处。Info
为{Module,Line}
。exit
- 进程已终止。Info
为ExitReason
。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
- 不保存有关当前调用的信息。
-spec test_at_break(Module, Line, Function) -> ok when Module :: module(), Line :: integer(), Function :: {Module, Name}, Name :: atom().
将Module
中Line
处的断点的条件测试设置为Function
。
函数 Function
必须满足断点部分中指定的的要求。