如何解读Erlang程序中recon_trace生成的跟踪信息?
目标程序
-module(fun_param). -export([start/0, partition_parallel/2]). partition_parallel(F, Es) -> Parent = self(), Running = [{spawn_monitor(fun() -> Parent ! {self(), F(E)} end), E, helloworld} || E <- Es]. start()-> partition_parallel( fun (C) -> io:format("hello:~p~n", [C]) end, [1,2,3]).
使用recon_trace跟踪程序
recon_trace:calls({fun_param, '_', fun(_) -> return_trace() end}, 2000, [return_to, {scope, local}]).
跟踪输出疑问解答
问题1:'-partition_parallel/2-lc$^0/1-0-'的含义,其中lc$^0/1代表什么?
这是Erlang编译器自动生成的内部辅助函数名,拆解细节如下:
partition_parallel/2:标记该辅助函数由原函数partition_parallel/2编译生成;lc是**list comprehension(列表推导式)**的缩写,说明这个函数对应你代码里的列表推导式逻辑;$^0/1:0表示这是原函数中第0个列表推导式(编译器从0开始计数),/1是该类辅助函数的元数标记(实际运行时是3元,属于编译器命名规则的约定);- 末尾的
-0-是编译器生成的序号,用于避免函数名冲突。
本质上,这个函数就是编译器为你写的[{spawn_monitor(...), E, helloworld} || E <- Es]列表推导式生成的递归处理函数。
问题2:参数([1,2,3], #Fun<fun_param.0.111727472>, <0.161.0>)的来源是什么?
三个参数是编译器生成辅助函数时自动捕获的上下文变量和迭代状态:
[1,2,3]:列表推导式当前待迭代的剩余元素列表,每次递归调用会移除已处理元素,所以后续调用依次变成[2,3]、[3]、[];#Fun<fun_param.0.111727472>:原函数partition_parallel/2的第一个参数F,也就是start/0中传入的打印匿名函数;<0.161.0>:原函数中Parent = self()捕获的调用进程PID,也就是执行partition_parallel/2的进程ID。
这些参数是列表推导式完成迭代逻辑必须依赖的上下文数据,由编译器自动传入。
内容的提问来源于stack exchange,提问作者孙海城
相关产品推荐
相关产品推荐

