资讯详情

Erlang/OTP Observer 应用版本演进全解析:从 crashdump_viewer 到 etop 与 ttb 的实战指南

📅 2026/9/24 16:47:37 | 华诺云谱 👁 阅读
Erlang/OTP Observer 应用版本演进全解析:从 crashdump_viewer 到 etop 与 ttb 的实战指南
编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载Observer 是 Erlang/OTP 中的图形化监控与调试套件整合了进程管理、etopErlang 版 top、appmon与tv等工具并提供基于ttb的分布式追踪能力。本文以仓库内 Observer Release Notes 为骨架结合 Observer 源码 与 使用指南系统梳理 Observer 从 0.9.6 到 2.19 的功能演进、关键修复与底层实现帮助你在实际运维与排障中用好这套工具。Observer 在 OTP 中的定位与组成Observer 应用取代了早期基于 gs 的 pman、etop、appmon、tv 等独立工具OTP-10915并新增了追踪设施。其核心模块分布在 lib/observer/src 中主要包括observer/observer_wxwx 图形界面的入口与主窗口提供start/0、start/1、start_and_wait/0|1等 API见 observer.erl。etop/etop_txt/etop_tr终端版进程监控工具与 UNIXtop类似。crashdump_viewercdv_*系列模块崩溃转储文件分析器以 wx 重写后取代了旧 webtool 接口OTP-11179。ttb分布式追踪工具包observer界面的追踪面板即基于它实现。observer_tv_wx等ETS/Mnesia 表查看器原 tv 功能。各组件对应的使用指南位于 lib/observer/doc/guidesobserver_ug.md、etop_ug.md、crashdump_ug.md、ttb_ug.md应用级文档见 observer_app.md。近期重点特性Observer 2.16 – 2.192.19-unsafe属性与 xref 新增三类调用分析Observer 2.19 引入了对-unsafe属性的支持用于把函数显式标记为不安全使用。它与弃用deprecation机制类似但相互独立编译器默认会对调用 Erlang/OTP 中已知始终不安全函数的代码生成警告。配合该属性m:xref现在可以用于查找undocumented_function_calls调用其它应用中缺少-doc属性的函数private_function_calls调用其它应用中标记为-doc false.的函数unsafe_function_calls调用标记为 unsafe的函数。这为静态分析提供了新的维度除运行时追踪外可以在编译期/分析期发现对未文档化、私有或危险函数的调用OTP-20066。2.16proc_lib:set_label/1为进程添加可读标签在 OTP 中无注册名的进程只能通过 Pid 识别。Observer 2.16 新增proc_lib:set_label/1可为任意进程附加一个描述性标签该标签会显示在c:i/0、m:observer中也会出现在使用gen_server、gen_statem、gen_event、gen_fsm的进程的 crash report 中通过proc_lib:get_label/1可获取。注意这两个函数对任意进程都可用并非只限于使用proc_lib的进程OTP-18789。原文档给出的实测示例1 self(). 0.90.0 2 proc_lib:set_label(my_label). ok 3 i(). . . . 0.90.0 erlang:apply/2 2586 75011 0 my_label c:pinfo/2 51 4 proc_lib:get_label(self()). my_label在源码层面Observer 的进程信息窗口通过 observer_procinfo.erl 中的observer_wx:try_rpc(node(Pid), proc_lib, get_label, [Pid])远程获取进程标签并展示。2.15start/1与start_and_wait系列 APIObserver 2.15 新增了start/1、start_and_wait functions/1|2函数OTP-18430。其中start/0、start/1可传单个节点名或节点列表直接启动图形界面start/1会让界面在启动后直接连接到指定节点start_and_wait/0|1在启动后阻塞等待用户关闭界面随后返回ok适合在脚本中调用以避免进程提前退出。实现位于 observer.erlstart(Node)会先尝试net_kernel:connect_node/1建立分布式连接再调用observer_wx:start()。2.18.1 / 2.18etop:stop/0与 etop 行为修正etop:stop/0完全停止后才返回OTP-19754此前调用返回时 etop 可能仍在收尾现在确保完全停止后再返回脚本化使用更可靠。etop 在 shell 中像 top 一样滚动显示OTP-19528进程列表随更新滚动而非整页重绘便于观察进程变化。timeout 相关的 specs 被增强OTP-19604改善了文档与 Dialyzer 分析精度。Crashdump Viewer 的演进与实战要点crashdump_viewer是 Observer 中最常被忽视却极其重要的排障工具。其演进史本身就是一部崩溃转储分析的实战手册。加载性能与格式兼容2.5 – 2.10早期加载大转储文件耗时呈指数增长OTP-9051 修复前250M 的 dump 需要 1–2 小时。0.9.9 起改为分块发送到浏览器并改用文本输入框手动输入完整文件路径规避浏览器对 HTML file input 的路径限制同时提供cdv/cdv.bat启动脚本位于priv目录。后续关键修复与增强包括2.5批量读取优化、进程详情进度条、cdv脚本设置ERL_CRASH_DUMP_SECONDS0防止分析节点自身再生成新的崩溃转储并警告分析节点可能覆盖被检视的 dumpOTP-14386。2.6转储文件中的二进制改为base64 编码取代 hex显著缩小文件体积新增版本标签检查遇到比 Viewer 更新的格式时先弹窗提示再退出不完整堆会显示警告OTP-14686、OTP-14755。2.8.2修复#{one1}这类字面量导致 Viewer 崩溃的问题并大幅优化含大量进程的 dump 打开速度——移除了每个进程一次ets:select的开销OTP-15391。2.10支持超过 255 的 Unicode 码点希腊文、西里尔字母等原子正确显示修正monitor_node/2monitor 的解析新增 socket 信息区块OTP-17346、OTP-17520 增加 trace all 按钮。2.10.1修复自 OTP 23.0 起存在的进程栈帧打印格式错误Viewer 同时兼容读取损坏格式OTP-17814。内存与分配器信息2.17 及更早2.17 修复了 Memory 标签页中 Allocator Summary 的块大小全部显示为N/A的问题OTP-19353。早在 1.3.1 版本Viewer 就已在进程概览与详情页展示 crash dump 新增的 Memory 字段并增加了 allocator 的 blocks/carriers 大小汇总。转储内容的持续扩展2.1 – 2.72.1展示 OTP 18 起转储新增的信息run queue 状态等新增内存分配器使用率/利用率图支持查看进程的 SASL 日志OTP-12363、OTP-12504、OTP-12631。2.6转储写入速度显著加快maps 纳入转储常量项只在一个进程中展示其余引用进程标记不完整堆OTP-14685。2.7新增进程二进制虚拟堆统计、GC 期间 OOM 进程的完整信息、更多端口信息与 dirty scheduler 信息OTP-14820进程信息窗口对海量 links/monitors 只显示少量并附 more... 展开链接OTP-14725。启动方式与注意事项通过cdv/cdv.bat脚本启动时2.3 起使用非分布式节点OTP-14010避免第二个实例因分布式节点冲突而启动失败。转储中 Slogan 多行、truncated binary、Old Binary VHeap 溢出、attributes 段被截断等边缘情况分别在 2.3.1、2.1.1、2.9.3、2.7 中修复。etop终端版 top 的配置与修复etop以文本方式呈现进程信息头部包含Loadcpu为 Runtime/Wallclock 活动时间占比、procs进程数、runq就绪进程数与Memory各分类的 KB 数每进程展示 Time调度运行时间、Reds规约数、Memoryprocess_info(Pid,memory)字节数、MsgQ消息队列长度。完整输出示例见 etop_ug.md。配置参数来自 etop.erl启动时通过etop -OptName Value命令行传入运行时可用etop:config/2修改参数类型说明linesinteger显示的行数进程数须 0intervalinteger每次刷新的间隔秒数须 0accumulateboolean为true时 Time/Reds 显示累计值否则显示距上次更新的增量sortruntime | reductions | memory | msg_q进程排序依据命令行示例etop -node tigerdurin -setcookie mycookie -lines 15。运行中修改示例 etop:config(lines,5). ok此外etop:dump/1可将当前显示转储到文本文件etop:stop/0完全停止2.18.1 起确保返回时已彻底停止。历次关键修复2.4远程节点数据等待超时从硬编码 1 秒改为与可配置的更新间隔一致OTP-14393避免进程极多时误报connection_lost。2.3.1修正etop误报自启动以来的平均 scheduler 利用率现正确显示上次更新以来的值OTP-14090。2.11显示宽度改为动态计算不再硬编码 89 字符OTP-17880。0.9.7修复 Load/Memory 头部信息错误如 binary 显示的是运行进程数OTP-6075。0.9.8修复关闭自定义分配器如Meamin时崩溃OTP-7519。2.16改用dbg:session/2避免干扰其它追踪OTP-19082并保证etop:stop/0完全停止2.18.1。ttb分布式追踪的工程演进Observer 的追踪功能建立在ttb之上。1.0 版本OTP-9403为ttb引入了大量新能力一键式追踪ttb:start_trace/4tracer/2新增shell控制台实时显示、timer限时追踪、overload过载保护、flush、resume节点重启后自动恢复等选项stop/1新增fetch_dir、{format,FormatOpts}、return_fetch_dirformat/2新增disable_sort。同时伴随不兼容变更timestamp追踪标志始终设置、fetch成为默认行为可用nofetch关闭等。2.3 为ttb:tracer/2增加queue_size选项OTP-13829内部使用 IP trace driver 时其待投递消息队列上限可配置默认值由dbg决定已从 50 改为 200。当收到大量{drop,N}消息时可通过调大queue_size减少丢弃该选项仅在追踪到 shell 或{local,File}时有意义。实现见 ttb.erl 的选项解析opt/2与tracer/2specs。GUI 与可用性改进HiDPI 支持OBSERVER_SCALE自 2.9 起OTP-15586Observer 支持通过环境变量OBSERVER_SCALE缩放界面以适配高 DPI 屏幕。实现位于 observer_wx.erlget_scale() - ScaleStr os:getenv(OBSERVER_SCALE, 1), try list_to_integer(ScaleStr) of Scale when Scale 1 - 1; Scale - Scale catch _:_ - 1 end.即读取环境变量并转为整数小于 1 或解析失败时回退为 1。主窗口尺寸850×600会乘以该缩放系数。配置文件的 XDG 支持2.122.12 起OTP-17554.erlang、.erlang.cookie、.erlang.crypt配置文件可以放在 XDG Config Home 目录下详见filename:basedir/2与相关文档为遵循 freedesktop 规范的桌面环境提供了标准化的配置存放位置。暗色主题、Unicode 与视觉改进2.2 起改进背景着色以适配暗色主题并支持修改图形窗口的更新频率与长度OTP-13556、OTP-13555。2.9.2 进一步改进 Linux 上的暗色模式配色OTP-15916。2.5 起全面进行 Unicode 改进工具正确显示 Unicode 原子OTP-14462、OTP-14464。2.13 修正 GUI 中的单位显示OTP-18151。其它值得关注的修复2.9修复 Logger 引入后菜单Log Toggle Log View在没有显式安装error_loggerhandler 时崩溃的问题OTP-15553修复展开 persistent_term 相关进程状态时的崩溃OTP-15493。2.7优化 ets/mnesia 表视图标签页此前列出 10000 张表非常慢OTP-14856。2.4刷新后保持表与端口选择关闭前保存设置并在启动时恢复OTP-14270对早于 OTP 19.0 的节点访问端口信息时弹窗提示而非崩溃OTP-14345。2.3.1不再依赖手动设置 Windows 上的 HOME 环境变量OTP-14249。2.2.1修复观察的节点与本节点 scheduler 数量不同时的崩溃OTP-13702。2.1修复端口标签页未打开时点击端口 HTML 链接导致的崩溃OTP-14151表视图无变化时不刷新OTP-12819。打包、发布与合规2.18.2Observer 2.18.2OTP-19886对发布布局做了系统性清理make release只把运行所需代码放入 release 目录文档与示例不再进入make release_docs将文档放入 release 的doc目录make release_tests将测试放入独立目录不再与部分源码混放SBOM软件物料清单将 examples 归类到SPDX-otp-app-doc包而非当作运行源码新增asmjit、zlib与 Erlang/OTP 项目之间的optional_components_of关系make与erts下的 autoconf 脚本以及各configure、Makefile.in等被归类为build_tool_ofOTP-19886。测试 release 的标准做法是./Install -minimal \pwd并把 release 加入PATH随后进入 release 的 tests 目录、进入test_server 运行模拟器执行测试。另外2.18 起OTP-19575所有文件统一采用含SPDX-License-Identifier的许可证头格式2.16 起应用依赖被完整列入 app 文件OTP-18831。结语从 0.9.6 到 2.19Observer 的演进覆盖了图形界面、崩溃转储分析、终端监控与分布式追踪四大方向。无论是通过OBSERVER_SCALE适配高分屏、用proc_lib:set_label/1增强进程可观测性、用cdv快速定位 OOM 与堆损坏还是借助ttb做跨节点追踪本文梳理的版本要点都可以直接指导你的日常排障实践。更完整的使用说明请结合 Observer 用户指南、crashdump_viewer 指南、etop 指南 与 ttb 指南 查阅。赞分享编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载相关推荐如何用 samber/lo 的 WaitFor 在超时前轮询等待条件成立如何用 samber/lo 的 WaitFor 在超时前轮询等待条件成立 在 Go 服务里经常需要等到某个外部状态出现再往下走依赖服务就绪、缓存预热完编程语言语言运行时标准库编译器并发编程Erlang/OTP eldap 应用发布说明全解析从版本演进到 LDAP 客户端实战Erlang/OTP eldap 应用发布说明全解析从版本演进到 LDAP 客户端实战 本指南以 Erlang/OTP 官方仓库中 lib/eldap/doc编程语言语言运行时标准库编译器并发编程Erlang/OTP Jinterface 版本演进全解析从 Release Notes 到源码的 Java–Erlang 分布式通信技术指南Erlang/OTP Jinterface 版本演进全解析从 Release Notes 到源码的 Java–Erlang 分布式通信技术指南 本文以 Erl编程语言语言运行时标准库编译器并发编程上一篇音乐歌词下载终极指南5分钟掌握批量LRC歌词获取技巧下一篇如何快速提升英雄联盟游戏体验智能游戏管家的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。