一、启动停止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().

dbg调试的更多相关文章

  1. linux编译相关命令

    一.编译可执行文件 g++ –c Hello.cpp  编译文件,生成目标文件Hello.o g++ Hello.o –o a.out  链接并重命名为可执行文件a.out g++ Hello.cc  ...

  2. JsRender 前端渲染模板常用API学习

    JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的,使用的情况有以下几种. 把html字符串编译编译成模板 获取使用script标签声 ...

  3. Luogu P2668 斗地主(NOIP2015)

    还记得那道我只用特判得了30分的"斗地主"吗? 我今天脑抽打算把它改A掉.为什么不用这大好时光去干些更有意义的事 于是我就挖了这个坑. 题解: 题目链接:P2668 斗地主 本题就 ...

  4. Apollo安装教程

    最近一直在研究Apollo的安装问题,浪费了几天时间,所有特意来记录一下安装心得. UBUNTU 14.04安装 这个我是把自己的笔记本全部转换为ubuntu系统,操作相对简单,大家可以自行查找,另外 ...

  5. Apollo移植

    Apollo移植 环境 平台 ubuntu16.04 Apollo_kernel 1.0 安装步骤步骤 步骤一:安装ubuntu(官方建议使用Ubuntu 14.04.3) 步骤一和步骤二参考文档路径 ...

  6. C语言入门(21)——使用DBG对C语言进行调试

    C语言入门(21)--使用DBG对C语言进行调试 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...

  7. Eclipse断点调试(DBG)Android应用

    1.添加断点 双击左侧边框便可添加断点,右击也能添加断点. 2.进入调试模式 点击虫子,然后选择工程运行,快捷键为单击F11 ,如果是正常运行就是Ctrl+F11 3.单步调试+跳到下一个断点 运行到 ...

  8. ida x32 dbg 动态调试

    http://www.xrwcn.com/html/8.html 0x20019u 注册表 RegOpenKeyEx函数 LONG RegOpenKeyEx( HKEY hKey, // handle ...

  9. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

随机推荐

  1. 在虚拟机上配置linux lab的相关经验

    最近一直在研究怎样在嵌入式开发板上移植linux嵌入式系统,但是不太想花费太多钱购买开发板.然后在网上搜索相关的arm模拟器.有qemu,skyeye,armulator等,在按照网上教程一步一步实践 ...

  2. 简单工厂设计模式(Simple Factory Design Pattern)

    [引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...

  3. Elasticsearch 5.0 _all field的简单认识

    前言:本文的目的是为后续磁盘空间利用优化做铺垫,主要知识点来源于官网 一._all 是什么 在Elasticsearch中,_all field维护这一个很大的字符串数组(text类型).这个字符串是 ...

  4. 详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机 ...

  5. Pelican搭建静态博客

    前言 一直以来都希望拥有属于自己的个人博客,随性发点信息,写点技术感想,记录自己的生活,重要的是不受广告的影响.不被河蟹.不会担心有一天被莫名其妙地消失. 之前看过一篇文章:"像黑客一样写博 ...

  6. linux下获取硬盘、内存、U盘大小及使用大小

    /* * 获取硬盘大小;内存大小;usb大小 */ #ifndef SYSINFOGET_H #define SYSINFOGET_H #include <stdio.h> //磁盘信息 ...

  7. for i in xrange(0,5)使用过程中遇到的问题

    文件中共有4行内容. fd = open("C:\Users\william\Desktop\dup_file - Copy (2).txt")for i in xrange(0, ...

  8. UIBezierPath与CAShapeLayer结合画扇形

    /*让半径等于期望半径的一半 lineWidth等于期望半径 就可以画圆*/ 可以看出layer的走势是从圆边的中间一半在圆外 一半在圆内 因此让半径等于期望半径的一半 lineWidth等于期望半径 ...

  9. js实现的笛卡尔乘积-商品发布

    //笛卡儿积组合 function descartes(list) { //parent上一级索引;count指针计数 var point = {}; var result = []; var pIn ...

  10. HDU 2176 取(m堆)石子游戏 尼姆博弈

    题目思路: 对于尼姆博弈我们知道:op=a[1]^a[2]--a[n],若op==0先手必败 一个简单的数学公式:若op=a^b 那么:op^b=a: 对于第i堆a[i],op^a[i]的值代表其余各 ...