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().
dbg调试的更多相关文章
- linux编译相关命令
一.编译可执行文件 g++ –c Hello.cpp 编译文件,生成目标文件Hello.o g++ Hello.o –o a.out 链接并重命名为可执行文件a.out g++ Hello.cc ...
- JsRender 前端渲染模板常用API学习
JsRender 常用API 1. $.templates() $.templates()方法是用来注册或编译模板的,使用的情况有以下几种. 把html字符串编译编译成模板 获取使用script标签声 ...
- Luogu P2668 斗地主(NOIP2015)
还记得那道我只用特判得了30分的"斗地主"吗? 我今天脑抽打算把它改A掉.为什么不用这大好时光去干些更有意义的事 于是我就挖了这个坑. 题解: 题目链接:P2668 斗地主 本题就 ...
- Apollo安装教程
最近一直在研究Apollo的安装问题,浪费了几天时间,所有特意来记录一下安装心得. UBUNTU 14.04安装 这个我是把自己的笔记本全部转换为ubuntu系统,操作相对简单,大家可以自行查找,另外 ...
- Apollo移植
Apollo移植 环境 平台 ubuntu16.04 Apollo_kernel 1.0 安装步骤步骤 步骤一:安装ubuntu(官方建议使用Ubuntu 14.04.3) 步骤一和步骤二参考文档路径 ...
- C语言入门(21)——使用DBG对C语言进行调试
C语言入门(21)--使用DBG对C语言进行调试 程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪.到目前为止我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码 ...
- Eclipse断点调试(DBG)Android应用
1.添加断点 双击左侧边框便可添加断点,右击也能添加断点. 2.进入调试模式 点击虫子,然后选择工程运行,快捷键为单击F11 ,如果是正常运行就是Ctrl+F11 3.单步调试+跳到下一个断点 运行到 ...
- ida x32 dbg 动态调试
http://www.xrwcn.com/html/8.html 0x20019u 注册表 RegOpenKeyEx函数 LONG RegOpenKeyEx( HKEY hKey, // handle ...
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...
随机推荐
- 【IE6的疯狂之九】li在IE中底部空行的BUG
曾经写过[IE6的疯狂之六]li在IE中底部3像素的BUG(增加浮动解决问题),原文地址:http://www.css88.com/archives/421: IE6 BUG大全: http://ww ...
- android应用编译失败 ResXMLTree_node size 类错误,以及 android studio 项目内搜索
今天很郁闷,又遇到个很让人崩溃的问题: ResXMLTree_node size 0 is smaller than header size 0x45. 类似这样的错误,提示中看不出任何有用的内容,网 ...
- node + express 资料
https://www.youtube.com/watch?v=65a5QQ3ZR2g&list=PL55RiY5tL51oGJorjEgl6NVeDbx_fO5jR https://www. ...
- C# 语言规范_版本5.0 (第10章 类)
1. 类 类是一种数据结构,它可以包含数据成员(常量和字段).函数成员(方法.属性.事件.索引器.运算符.实例构造函数.静态构造函数和析构函数)以及嵌套类型.类类型支持继承,继承是一种机制,它使派生类 ...
- 页面导入样式时,使用link和@import有什么区别?
1 link属于XHTML标签,而@import是CSS提供的: 2 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载: 3 import只有在IE5以上才能 ...
- laravel sum 多个字段
laravel中怎么实现下面的SQL select sum('profit'),sum('order_count') from pro where......; 参考 self::where('id' ...
- selenium+python在Windows的环境搭建
1 python下载安装 python早已安装,不再多说.因为开发使用的python2.7,所以同样使用2.7 2 打开Powershell, 输入python -m pip install sele ...
- 一个初学者的辛酸路程-FTP-9
前言 今天,我要描述一个FTP的故事 主要内容 嗯,今天主要以阶梯性的形式来做一个FTP项目. 第一步: 我要实现这么一个功能,一个FTP客户端,1个FTP服务端,2端建立连接以后可以进行通讯. 服务 ...
- JQuery $ $.extend(),$.fn和$.fn.extend javaScript对象、DOM对象和jQuery对象及转换 工具方法(utility)
一.为什么jquery前面要写$ Javascript没有package的概念,而作者又希望所有jQuery相关的API都能通过一个全局性的对象来容纳. 名为jQuery的全局变量就是这样一个对象,不 ...
- 一:python入门
Python简介 这点就不做陈述了,相信各位朋友已经已经有了一定的了解. Python特色: 1:简单 第一次接触Python给我的感觉它的语法阅读就像是阅读一本英文书的目录一样,简单易懂,它的语法要 ...