2016-07-26 86 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

快樂幫助! –