dbg:可视化递归函数的跟踪器,例如通过缩进

2023-12-30

我在调试复杂的递归函数时遇到问题,我正在使用以下习惯用法:

dbg:tracer(),dbg:p(all,c),dbg:tpl(Mod,Fun1,x),dbg:tpl(Mod,Fun2,x)...

这给了我一个对所有函数的调用的平面列表,其中很难找出哪个返回属于哪个调用。

有没有一种简单的方法可以使其更具可读性,例如通过缩进。

我可以对生成的文本进行后处理,并为每次调用缩进,为每次返回增加缩进,但这对我来说听起来不太优雅。


与此同时,我想出了如何做到这一点,实际上并不太难。要让进程处理跟踪消息输出,您只需使用dbg:trace/2,3并编写一个进行格式化的函数。

我们编写一个包含要传递给的函数的小模块dbg:trace:

-module(trtool).
-export([nested/2]).

nested({trace, _Pid, call, {Mod, Fun, Param}}, Level) ->
    io:format("~s~p:~p ~p\n", 
              [lists:duplicate(Level, "|   "), Mod, Fun, Param]),
    Level + 1;
nested({trace, _Pid, return_from, {Mod, Fun, Arity}, Rval}, Level) ->
    L = Level - 1,
    io:format("~s~p:~p/~b -> ~p\n", 
              [lists:duplicate(L, "|   "), Mod, Fun, Arity, Rval]),
    L;
nested(Any, Level) ->
    io:format("trace_msg: ~p\n", [Any]),
    Level.

该函数有两个参数,第一个参数传递跟踪消息,该消息是一个带有方便字段的元组。要了解要格式化的消息的结构,只需从一个简单的函数开始,该函数会打印所有内容,如示例函数的最后一个子句。

第二种格式是一种可以包含任何数据的状态。我们在调用时传递初始值dbg:trace并从我们的函数返回下一个值。

In the nested例如,我们只传递缩进级别,该级别将在call and return_from条款。

现在让我们尝试一下,首先调用dbg:tracer/2,第一个参数必须是原子process,第二个参数是一个元组,包含我们新编写的 fun 和状态参数的初始值。

1> dbg:tracer(process, {fun trtool:nested/2, 0}).                         
{ok,<0.70.0>}

然后我们像以前一样设置跟踪:

2> dbg:p(all, c), dbg:tpl(user_default,hop,x),dbg:tpl(user_default,rec,x).
{ok,[{matched,nonode@nohost,2},{saved,x}]}

然后我们开始调用跟踪函数,并且可以轻松跟踪嵌套:

3> rec(3).                                                                
user_default:rec [3]
|   user_default:rec [3,1,3]
|   |   user_default:rec [3,1,2]
|   |   |   user_default:rec [3,1,1]
|   |   |   |   user_default:rec [3,1,0]
|   |   |   |   |   user_default:hop [3,1,0]
|   |   |   |   |   user_default:hop/3 -> {3,21}
|   |   |   |   user_default:rec/3 -> {3,21,1}
|   |   |   |   user_default:rec [6,2,-1]
|   |   |   |   |   user_default:hop [6,2,1]
|   |   |   |   |   user_default:hop/3 -> {2,46}
|   |   |   |   user_default:rec/3 -> {2,46,1}
|   |   |   user_default:rec/3 -> {5,67,2}
|   |   |   user_default:rec [8,3,0]
|   |   |   |   user_default:hop [8,3,0]
|   |   |   |   user_default:hop/3 -> {3,144}
|   |   |   user_default:rec/3 -> {3,144,1}
|   |   user_default:rec/3 -> {8,211,3}
|   |   user_default:rec [11,4,1]
|   |   |   user_default:rec [11,4,0]
|   |   |   |   user_default:hop [11,4,0]
|   |   |   |   user_default:hop/3 -> {3,258}
|   |   |   user_default:rec/3 -> {3,258,1}
|   |   |   user_default:rec [14,5,-1]
|   |   |   |   user_default:hop [14,5,1]
|   |   |   |   user_default:hop/3 -> {2,260}
|   |   |   user_default:rec/3 -> {2,260,1}
|   |   user_default:rec/3 -> {5,518,2}
|   user_default:rec/3 -> {13,729,5}
user_default:rec/1 -> {15,729}
{15,729}
4>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dbg:可视化递归函数的跟踪器,例如通过缩进 的相关文章

  • 除了 Erlang 之外,还有哪些系统是基于“绿色流程”的?

    我正在阅读这个信息页面绿线 维基百科 http en wikipedia org wiki Green thread我想知道 除了 Erlang 之外 还有哪些编程系统依赖于 绿色进程 Edit 绿线 绿色流程 基于绿色流程 Erlang
  • 如何在 Firefox 30 上调试 Greasemonkey 脚本?

    我一直在为 Youtube 开发一个 JavaScript 片段 它使用 Greasemonkey 并且还导入 Bootstrap 和 jQuery 库 该应用程序必须为每个搜索列表结果添加一个按钮 当用户单击该按钮时 它必须带出用户从其频
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 如何在 NetBeans 中以调试模式单步执行已实现的方法?

    我有课XImpl java它实现了一个接口X java 以及所有它的方法 我调试项目 在执行流程中遇到一个方法X processSomeValue 现在 当我尝试进入该方法时processSomeValue 我无能为力 有什么办法可以让我进
  • 调试WCF时无法自动单步进入服务器

    我得到了可怕的 无法自动进入服务器 无法调试远程过程 这通常表明服务器上尚未启用调试 现在 我一直在读我需要添加
  • JavaScript IDE/编译器

    现在 我希望你们中的一些人能够理解我的要求 我是编程新手 我在 Codecademy com 上了解了 JavaScript 我使用 labs codecademy com 来编写 JavaScript 但它有限制 对于编程新手来说 我可以
  • .NET 发布模式构建中是否提供堆栈跟踪信息?

    如果我选择发布模式来构建 dll 堆栈跟踪信息仍然可用吗 如果是的话 那么什么信息is发布模式下不可用 您始终拥有堆栈跟踪信息 这是与构建模式无关的运行时功能 但行号和源文件名通常在发布构建堆栈跟踪中不可用 您可以通过更改构建配置来创建完整
  • ASP.NET MVC 2 发行版本的实际调试符号

    我需要 ASP NET MVC 2 发布版本 通过 Web 平台安装程序安装的版本 中的实际调试符号 我知道我可以下载源代码 构建并使用其中的调试符号 但这种方法有几个问题 要求使用此版本的 DLL 重建所有其他依赖项 因为它未签名 如果您
  • jquery 隐藏简单的 javascript 错误

    我在 chrome 和 firefox 中使用 jQuery 和 flot 当我编写代码时 我发现执行在一些愚蠢的事情上会默默失败 例如访问不存在的哈希结构等 感觉 jQuery 中有一些 try catch 逻辑 让我看不到任何错误 有没
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • 使用 AJAX 加载的 Javascript 和 MVC4 部分视图

    我有一个 ASP NET MVC 4 视图 可以动态地将两个嵌套部分加载到 div 通过 JQuery AJAX 调用的元素 每个部分都有一大堆自己的 Javascript 为了让它全部正常工作 我目前将所有 Javascript 都放在s
  • 如何检查 MVC cshtml 页面中的调试模式

    如何检查 MVC cshtml 页面中的调试模式 此代码在 cshtml 页面中不起作用 bool isRelease false if DEBUG isRelease false else isRelease true endif if
  • Eclipse 在单独的窗口中打开代码

    我正在 eclipse 中编程 在两个显示器设置上运行 在其中一台显示器上 我只获得了项目资源管理器和编辑器作为自定义透视图 而在另一台显示器上 我获得了其他工具 例如控制台 调试 任务 变量 断点等 例如 当我单击任务视图中的任务时 这将
  • 如何在erlang中读取mnesia数据库的所有记录?

    我是 erlang 新手 我需要对从 mnesia 数据库获取的所有记录进行一些操作 Result mnesia dirty read mydatabase key1 key2 case Result of gt DEBUG No such
  • 在 Erlang 中实现图灵机

    我有一个小项目 与实现图灵机非常相似 我遇到的基本问题是保存当前配置 例如头部的位置和更多信息 对我来说特别重要的是保留头部位置以使其向前或向后移动 Erlang 解决这个问题的方法是什么 我是 Erlang 新手 但据我探索 OTP ge
  • 我的 Delphi 11.1 调试器在 x64 项目上突然变得非常缓慢;大约一周前还可以。有什么想法吗?

    更新 拔掉网络 电缆和wifi 会导致 几乎 恢复正常的调试速度 已尝试禁用防火墙没有任何变化 但没有网络恢复正常服务 更新 2 所有 Windows x64 版本都存在缓慢问题 而不仅仅是单个大型项目 如果我构建并调试 32 位 Wind
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各
  • 多线程调试器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 GDB 在使用多线程 pthreads 进行调试时存在严重问题 nix 上还有其他好的 C C 多线程调
  • 在调试模式下运行 NPX 命令

    我有一些npx create react app命令卡住了 终端上没有显示任何错误 所以 我需要运行npx in 调试模式 有没有办法获得debug登录npx命令来识别问题 edit 我运行的命令 npx create react app
  • 内存转储格式类似于 gdb 中的 xxd

    我正在尝试检查一个缓冲区 其中包含二进制格式的消息 但也包含字符串数据 作为示例 我正在使用以下 C 代码 int main void char buf 100 x01 x02 x03 x04String Data xAA xBB xCC

随机推荐