2016-07-26 71 views
2

我试图将所有调用记录到dbg进行调试(感谢this答案)。下面的代码:使用`dbg`跟踪函数时,仅记录调用跟踪中的特定参数?

-module(a). 
-export([main/0]). 

trace_me(_, _, _) -> 
    ok. 

main() -> 
    dbg:start(), 
    dbg:tracer(), 
    dbg:tpl(a, trace_me, 3, []), 
    dbg:p(all, c), 
    LargeBinary = binary:copy(<<"foo">>, 10000), 
    trace_me(foo, bar, LargeBinary). 

的问题是争论的一个是真的大型二进制,并且上面的代码将打印每一个电话,完整的二进制:

1> c(a). 
{ok,a} 
2> a:main(). 
(<0.57.0>) call a:trace_me(foo,bar,<<"foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo...lots of foos omitted...">>) 
ok 

是否有可能(不修改trace_me/3):

  1. 只打印每个调用的前2个参数?

  2. 打印第二个参数+第三个参数的前几个字节,或者只是在打印之前通过自定义函数传递第三个参数?

+0

你有没有试过我的建议与redbug,或者你是否真的需要DBG? –

+0

@ marco.m对不起,我没有机会更新你。我真的想要一个解决方案而不添加任何新的依赖关系。感谢您发布的视频,我潜入了redbug和dbg的实现中,并编写了一个小函数,它使用tracer API来执行我想要的操作。我会尽快在这里发布解决方案。 – Dogbert

回答

2

我不知道有dbg,但你可以使用非常好,小redbug

trace_me(_, _, _) -> 
    ok. 

do_redbug() -> 
    % 1. print arguments as dbg: 
    % redbug:start("a:trace_me"), 

    % 2. print arity only: 
    % redbug:start("a:trace_me", [arity]), 

    % 3. Specify the formatting depth: 
    redbug:start("a:trace_me", [{print_depth, 10}]), 

    LargeBinary = binary:copy(<<"foo">>, 100000), 
    trace_me(foo, bar, LargeBinary). 

在上面的链接看看(相当简洁)红虫文档获取更多选择以及如何传递自己的打印机/格式化程序功能。

还要注意,与dbg相反,redbug可以安全地用于生产系统。请查看redbug作者的演示文稿:Taking the printf out of printf Debugging

+0

我结束了使用我现在写的一个小模块:https://gist.github.com/3cc6b76e9a58823c763e3f000ccf4bed。它不处理像元组之类的大型二进制文件,但我不想在这个玩具项目中添加依赖项,这已经足够了。 Redbug看起来像是一个更强大的调试生产应用程序的解决方案。感谢您的建议和演示视频链接。 – Dogbert

+0

快乐帮助! –