• dbg调试


    一、启动停止dbg

    dbg:tracer().

    dbg:stop().

    二、跟踪常用函数

    1、跟踪进程

    dbg:p(PidSpec,TraceFlags).

    PidSpec

    Pid 一个特定进程ID

    all 跟踪所有进程

    new 跟踪调用调试器之后产生的所有进程

    existing 将跟踪调用调试器之前产生的所有进程

    alias 一个注册进程的别名,除all、new或者existing之外

    {X,Y,Z} 只是由进程ID<X.Y.Z>

    TraceFlags

    s 跟踪发送消息

    r 跟踪接收消息

    m 跟踪发送和介绍消息

    p 跟踪与进程有关的事件

    c 根据dgb:tp/2调用里设定的跟踪模式来跟踪全局和局部调用

    sos和sofs 指示set_on_first_spawn标志,我们已经在”继承标志“小结中提到过

    sol和sofl 指示set_on_link和set_on_first_link标志,我们已经在”继承标志“小结中提到过

    all 设置所有标志

    clear 清除所有设定的跟踪标志

    例如:

    dbg:tracer().

    dbg:p(all,[c]).

    dbg:stop().

    2、跟踪和性能分析函数

    dbg:c(io,format,["Hello World!~n"]).

    3、跟踪局部和全局函数调用

    dbg:tp({Mod,Fun,Arity}, MatchSpec).启动调用跟踪

    dbg:ctp({Mod,Fun,Arity}).停止调用跟踪

    dbg:tracer().

    dbg:p(all,[c]).

    dbg:tp({ping,'_','_'},[]).

    dbg:ctp({ping,'_','_'}).

    dbg:stop().

    4、分布式环境

    dbg:n(Node).增加一个分布式的ERLANG节点到跟踪列表上,

    dbg:cn(Node).删除节点

    dbg:ln().列出跟踪的节点

    5、重定向输出

    dbg:tracer(process,{HandlerFun,Data}).

    所有的进程会作为参数传递给HandlerFun,他是用户定义的一个二元fun函数,第一个参数是跟踪信息,第二个是用户定义的Data,函数返回的数据会传给他的下一迭代,类似于累加器。

    HandlerFun =
    fun({trace,Pid,gc_start,Start}, _) ->
        Start;
        ({trace,Pid,gc_end,End},Start) ->
            {_,{_,OHS}} = lists:keysearch(old_heap_size,1,Start),
            {_,{_,OHE}} = lists:keysearch(old_heap_size,1,End),
            io:format("Old heap size delta after gc:~w~n", [OHS-OHE]),
            {_,{_,HS}} = lists:keysearch(heap_size,1,Start),
            {_,{_,HE}} = lists:keysearch(heap_size,1,End),
            io:format("Heap size delta after gc:~w~n", [HS-HE])
        end.

    dbg:tracer(process,{HandlerFun,null}).

    dbg:p(self(),[garbage_collection]).

    List=lists:seq(1,1000).

    RevList=lists:reverse(List).

    6、重定向套接字和二进制文件

    dbg:tracer(port,PortFun).

    PortFun 由trace_port(ip,Port).或则trace_port(FileName,Fileoption).的返回值

    例如:

    节点1

    PortFun = dbg:trace_port(ip,1234).

    dbg:tracer(port,PortFun).

    dbg:p(all,[c]).

    dbg:tp({ping,'_','_'},[]).

    dbg:tpl({ping,'_','_'},[]).

    dbg:ping:start().

    ping:send(Pid).

    节点2

    Pid= dbg:trace_client(ip,1234).

    dbg:stop_client(Pid).

    7、匹配规则

    dbg:fun2ms([Head,Conditions,Body]).

    1)head

    绑定匹配变量和项元

    2)Conditions

    逻辑变量应用到项元

    3)Body

    预处理行为

    常用行为

    {message,Args} 将Args添加到跟踪事件中。

    {return_trace}  函数返回触发跟踪消息发送

    {exception_trace} 运行时错误导致所跟踪的函数退出,所残生的跟踪消息

    {caller} 返回调用函数

    8、存储匹配规则

    dbg:tp({io,format,1},[{'_',[],[{message,{process_dump}}]}]).
    {ok,[{matched,nonode@nohost,1},{saved,1}]}

    {saved1,}存储匹配规则,可以用数字1代替匹配规则本身

    dbg:ltp().列出所有匹配规则

    dbg:dtp() and dbg:dtp(Id).删除匹配规则

    dbg:wtp(FileName).和dbg:rtp(FileName).从一个文件读写匹配规则

    9> DbgFun = fun({trace,_Pid,_event,_data,Msg}, _Acc) -> io:format("~s~n",[binary_to_list(Msg)]) end.
    #Fun<erl_eval.12.111823515>
    10> dbg:tracer(process,{DbgFun,null}).
    {ok,<0.51.0>}
    11> dbg:tp({io,format,1},[{'_',[],[{message,{process_dump}}]}]).
    {ok,[{matched,nonode@nohost,1},{saved,1}]}
    12> dbg:p(all,[c]).
    {ok,[{matched,nonode@nohost,27}]}
    13> io:format("Hello~n").

    1> dbg:tracer().

    {ok,<0.34.0>}

    2> dbg:p(all, c).

    {ok,[{matched,nonode@nohost,26}]}

    3> dbg:tpl(test, g, dbg:fun2ms(fun(_) -> exception_trace() end)).

    {ok,[{matched,nonode@nohost,1},{saved,x}]}

    4> dbg:stop(),  dbg:stop_clear().

  • 相关阅读:
    (转)建表参数(pctfree,IniTrans,maxtrans)含义
    oracle 中事务提交
    如何创建线程安全的list
    [转] Redis 存储List对象
    【转】 Oracle用户密码过期和用户被锁解决方法
    【转】oracle中rownum和row_number()
    [转]如何防止博客园文章被窃取
    【转】解锁 时 ORA-00942 表或视图不存在 问题的解决
    java 接口可以多继承--【转】http://blog.csdn.net/tiantiandjava/article/details/46514783
    echarts 问题
  • 原文地址:https://www.cnblogs.com/yanwei-wang/p/4655064.html
Copyright © 2020-2023  润新知