<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 21, 2015 at 8:58 PM, Michael L Martin <span dir="ltr"><<a href="mailto:mmartin4242@gmail.com" target="_blank">mmartin4242@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">If that's already possible,
    I couldn't find a way to do it.</div></blockquote></div><div class="gmail_extra"><br></div>[I do have comments, but this question warrants an answer]</div><div class="gmail_extra"><br clear="all"><div>You can do this via 'dbg', because it is the same calls you have to make. The  problem is you need to set up call tracing on the functions for which you are interested. And you also need to set up which pids it affects. The intersection, i.e., the marked pids which calls the marked functions, will output trace patterns:</div><div><br></div><div>-module(z).</div><div><br></div><div>-export([f/0]).</div><div><br></div><div>g() -> 37.</div><div><br></div><div>f() -></div><div>    dbg:tracer(), %% Construct a tracer</div><div>    dbg:p(self(), call), %% Call tracing for ourselves enabled</div><div>    dbg:tpl(z, g, 0, cx), %% Set a tracepoint for a local function, enable caller/exception trace flags for it</div><div>    g(),</div><div>    dbg:stop_clear(). %% Get rid of the tracer again</div><div><br></div><div><br></div><div><div>; erl</div><div>Eshell V7.0.3  (abort with ^G)</div><div>1> c(z).</div><div>{ok,z}</div><div>2> z:f().</div><div>(<0.33.0>) call z:g() ({z,f,0})</div><div>(<0.33.0>) returned from z:g/0 -> 37</div><div>ok</div><div>3> </div></div><div><br></div><div>though the dbg interface is unwieldy, it does provide a lot of power. A simpler and safer solution is Fred Hebert's recon library:</div><div><br></div><div>f() -></div><div>    recon_trace:calls({z, g, fun(_) -> return_trace() end}, 10, [{scope, local}]),</div><div>    g(),</div><div>    recon_trace:clear().</div><div><br></div><div>Simpler interface, but also less powerful. I tend to use both.</div><div><br></div><div>The power is the dynamic tracing capabilities. You can enable them on production systems as you inspect them. If tracing is enabled through recompilation, you have to mess with the injected modules on the running system. Very good for debugging, but your operations department will hate you for the fact that they don't know which code is currently executing on their system.</div><div><br></div><div>That said, however, a simpler debug-tracing interface is not a bad idea I think. Anything that can help programmers build robust code.</div><div><br></div>-- <br><div class="gmail_signature">J.</div>
</div></div>