【问题标题】:Turning on dbg tracing on a remote node?在远程节点上打开 dbg 跟踪?
【发布时间】:2014-04-11 18:13:35
【问题描述】:

在系统测试中运行我们的 Erlang 应用程序时,我有时想打开并捕获调试跟踪。

Erlang 节点是使用 relx 启动脚本(称为_rel/bin/foo foreground)启动的,因此我无法控制启动选项。系统测试运行程序(用 Python 编写)正在从节点捕获标准输出。

如何使用-remsh 连接到Erlang 节点,打开dbg-tracing,并将输出写入原始节点上的标准输出?以及如何以对 Python 友好的方式完成这一切(尽管我很乐意编写一个 escript,如果这样会更容易的话)。

更复杂的是,relx 生成的版本不包含runtime_tools 库,因此dbg: 实际上不可用,所以我还要添加this question

【问题讨论】:

    标签: erlang


    【解决方案1】:

    你可以做到这一点的方法很少。一切都取决于您熟悉什么,以及您的用例是什么。

    • 我会从手工开始。这样一来,您就可以最大程度地控制正在发生的事情以及效果的外观(如果您进行太多调试或不够调试)。这是我最熟悉的,最后你几乎总是必须连接到远程 shell 并手动做一些事情(根据我的经验)

    • dbg 的一个功能是没有太多人谈论我从文件中保存/加载跟踪粘贴的能力。我找到了在会话之间存储和共享调试信息的最简单方法;但缺乏可读性可能是一个太大的权衡。

    • 如果您不想过多干扰实时系统,则不必使用dbg。您可以使用默认给出的erlang:trace,但您必须小心您离开虚拟机的状态(dbg 应该在退出时关闭所有跟踪;erlang:trace 这是您的责任)

      李>
    • 如果您调试会话是 python 脚本的一部分,那么编写 escript 并从 python 调用它将是我的方式。您只需要记住 escripts 是在新 VM 中运行的,-remsh不允许让您只在其他 VM 上运行您的代码。为此,您必须使用 rpc 模块。

    • 由于您使用的应用程序已发布,您可能会考虑进行日志记录。有人可能会认为应该已经有一些日志记录,很可能是lager,这在 Erlang 中有点标准,也可能是 change logging level during runtime

    我个人会尝试混合使用第一个和最后一个选项,然后进行实验。

    【讨论】:

    • 我们已经在使用贮藏啤酒进行普通的伐木;对于这个特定的失败测试,​​我想跟踪我的模块中的每个调用函数。这不是在生产中,所以我不担心性能影响。
    猜你喜欢
    • 2018-02-27
    • 2017-04-16
    • 2017-01-16
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2016-11-30
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多