【问题标题】:erlang using 100% one of CPUserlang 使用 100% 的 CPU 之一
【发布时间】:2011-06-25 12:38:32
【问题描述】:

当我的项目被冻结时,我遇到了这种情况。 我只看到其中一个 CPU 的使用率为 100%(其余为 0%,但我正在使用 SMP)。

我的管理控制台说:

=ERROR REPORT==== 11-Feb-2011::00:45:00 ===
** Node 'node@example.com' not responding **
** Removing (timedout) connection **

之后我无法连接到节点。

如果我使用 C++ 编程,我可以进行调试构建,当这种情况发生时,我可以附加到我的进程并查看它正在循环的代码。

但是我如何在 Erlang 中做到这一点?我怎样才能获得调用堆栈或其他东西来帮助我了解真正的错误?

感谢您的帮助。

【问题讨论】:

    标签: erlang stack-trace


    【解决方案1】:

    您可以在命令行中使用调试信息编译您的模块:

    $ erlc +debug_info module.erl
    

    或者在 Erlang shell 中:

    1> c(module, debug_info).
    ok
    

    当您已经开始您的流程时,您可以选择附加到工作流程。在你的 erlang shell 中启动调试器:

    2> debugger:start().
    

    将出现调试器窗口。从菜单中选择 Module -> Interpret 并选择适当的模块,您希望在解释对话框窗口中附加到该模块。完成后,您将在调试器的右侧窗口中看到您的模块。

    现在选择Process -> Attach,应该会出现Attach Process窗口。

    【讨论】:

    • 不确定它是否适合您,但它会在第一次调用我的模块时触发附加进程窗口,并允许我逐步跟踪代码。
    • 不知道什么时候发生的,一天有一次,但时间不详。它是远程生产服务器。我只有 ssh 访问权限,根本没有 X(而且问题太大)。主要问题是 - 我不知道哪个模块有错误(我有很多模块),如果我制作 +debug_info 它可能会降低性能......也许你知道解决这个问题的其他方法?例如进行某种转储以检测至少有问题的模块
    • @vinnitu:我正在阅读Using trace and dbg in Erlang 以确定它是否对您有用。
    • @vinnitu +debug_info 完全不会影响性能。它只会使横梁变大一点。
    【解决方案2】:

    如果 erlang 发行版已关闭,您将无法使用任何远程调试,因为您无法连接到节点。如果配置为这样做,您将必须连接到 VM 在启动时创建的管道。请参阅http://www.erlang.org/doc/man/run_erl.html 了解如何执行此操作。

    您可能还想查看此线程以了解您的系统运行方式的原因:http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:55859:201101:jconogbffcaogeijbdkl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-10
      • 2015-09-27
      • 2017-05-23
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      相关资源
      最近更新 更多