【问题标题】:How do you debug functions from includes in Erlang?你如何从 Erlang 的包含中调试函数?
【发布时间】:2015-11-18 01:13:15
【问题描述】:

ScrumJet on GitHub 的实现(在撰写本文时)在任务、类别和板的存储模块之间共享基本相同的功能。这是通过将大量使用?MODULE 宏的相同代码移动到scrumjet_datastore.hrl 来实现的。 scrumjet_task.erlscrumjet_category.erlscrumjet_board.erl 中的每一个都包含 scrumjet_datastore.hrl 并且没有本地定义的函数。

当没有任何问题时,这非常有效。但是,如果我需要调试,那么调试器会调出空模块而不是定义函数的头文件。

有谁知道如何让 Erlang 调试器为包含中的函数工作?

【问题讨论】:

  • 最简单的方法是您只需将代码从头文件复制粘贴到模块源并重新编译。
  • 在我看来 scrumjet_datastore 应该是一个 erlang 模块,每个函数都将表名作为附加参数。除了调用那些“空”模块,还可以调用 scrumjet_datastore 并传递表名......
  • 我同意 Zed 的观点,除非您知道需要 .hrl 文件和宏的具体原因,否则请尽可能使用普通模块和参数。这简化了很多。暂时不要担心性能或内联。
  • 谢谢 Zed 和 Adam。你们是对的。记录使参数化复杂化,因为在模式匹配或调用record_info/2 时,它们在运行时不能是变量。但是,scrumjet_datastore 模块可以使用辅助函数进行参数化,以在运行时获取记录的 record_info(fields, ...):
     fields(scrumjet_task) -> record_info(fields, scrumjet_task);字段(scrumjet_category)-> 记录信息(字段,scrumjet_category);字段(scrumjet_board)-> 记录信息(字段,scrumjet_board)。 
    查询也需要辅助函数。
  • 谢谢 Zed :) 谢谢 Adam Lindberg :) 我 [重构 ScrumJet 以使用具有参数化函数的单个数据存储模块(提交 beb68b66)][github.com/AlainODea/scrumjet/commit/….

标签: erlang debugging include


【解决方案1】:

在 Erlang 中使用包含来共享函数的实现通常不是一个好主意。它有一些用途,但在常规应用程序代码中应避免使用。

正如我在 2009 年提到的,我遵循了 Zed 和 Adam Lindberg 的建议,并改用了带有参数化方法的数据存储模块。

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 2015-05-10
    • 1970-01-01
    • 2010-10-08
    • 2012-08-14
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多