热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

erlang问题定位利器recon_trace

闲聊几句用erlang有1年有余,也是第一次接触函数式编程,主要用于编写性能测试工具,在使用初期问题较少,遇到问题我仍习惯性通过debug来解决,勉强能用,但是随着系统复杂性增加,

闲聊几句

用erlang有1年有余,也是第一次接触函数式编程,主要用于编写性能测试工具,在使用初期问题较少,遇到问题我仍习惯性通过debug来解决,勉强能用,但是随着系统复杂性增加,多线程运行时debug就显得难上加难,这是和之前面向过程编程有本质区别。

之后结识了dbg trace,很强大的工具,可以很方便地分析系统执行过程中的情况,但是相比较而言我会更推荐recon_trace这个工具,该工具是程序员里漫画画的最好的Fred写的,同时也是<>的作者。

初识recon_trace

recon_trace绝对是协助你定位线上问题的一把利器,目前只支持trace函数调用,基本够用了。工具基于erlang:trace进行了二次封装,特性如下:

  • 调用更友好,比起dbg:trace()和erlang:trace()更好用
  • 防止用户trace信息过多引起系统崩溃,比如trace当前节点所有进程的函数调用信息
  • 提供maxcount,maxfre参数,防止flooding
  • 输出信息格式优化

小试牛刀

先来试试trace 任意进程对queue:new的调用

注意最后那个参数,1就是maxcount参数,它决定了最多trace信息的数量,防止tracce flooding。

1> recon_trace:calls({queue, new, ‘_’}, 1).
1
2> queue:new().
{[],[]}
3>
22:26:54.646000 <0.55.0> queue:new()
3> Recon tracer rate limit tripped.
3>

返回值去哪了

我们如果想获取调用函数的返回值需要return_trace的帮助,如下:

6> recon_trace:calls({queue, new, fun(_) -> return_trace() end}, 2).
1
7> queue:new().

22:45:09.098000 <0.55.0> queue:new()

22:45:09.098000 <0.55.0> queue:new/0 –> {[],[]}
{[],[]}
Recon tracer rate limit tripped.

本实例中除了return_trace需要添加外,maxcount的数量你也可以尝试改为1,试试看,你会对maxcount有更深的认识

来个更复杂的

when语句限定了只trace属于queue模块的函数的调用,且第一个函数参数为列表或第一个参数为大于1的数字。另外请注意最后一个tuple参数,这个参数可以理解为maxfreq,即trace信息的最大频率,{10,100}表示100毫秒内做多打印10条trace信息。这算是防止flooding的另外一种策略。

recon_trace:calls(
      {queue, '__', fun([A,_]) when is_list(A); is_integer(A) andalso A > 1 -> return_trace() end},
      {10,100}
).

如何限定调用pid

有时我们只关注发生在特定进程的调用,那么就需要calls/3,在第三个参数可以指定附加参数信息,还有其他附加参数,这里不一一列出,可以看官方文档,或者索性直接源码。

recon_trace:calls({queue, '_', '_'}, {50,1000}, [{pid, Pid}])

如何停止trace

recon_trace:clear()


推荐阅读
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
author-avatar
手机用户2502873667
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有