Hi all,
Does Poly/ML include any facility for tracing calls to (certain) functions? I am interested in generating a log of all calls to certain functions (including their arguments), in order, during the run of some program.
Perhaps there is something in the profiler that can help with this?
Cheers, Ramana
Hi Ramana, There's nothing specific but the new DebuggingInterface structure should allow you to build this yourself.
First build the new compiler with "make compiler" then compile your function with PolyML.Compiler.debug := true; before it. You don't need to compile your whole program with debugging; just the bit with the function you're interested in.
PolyML.Compiler.debug := false; (* Don't compile this with debugging! *) open PolyML.DebuggerInterface PolyML.NameSpace;
fun trace(fnName, _) = if String.isSubstring "myname" fnName then let val args = debugFunctionArg(hd(debugState(Thread.Thread.self()))) in PolyML.prettyPrint(TextIO.print, 90 (* Line length *)) (displayVal(args, 100 (* Depth *), PolyML.globalNameSpace)) end else (); setOnEntry(SOME trace);
Run your program and every time it enters a function that matches the test it will print the arguments.
The DebuggerInterface structure is still a bit fluid so some things may change before the final release.
David
On 11/10/2015 08:20, Ramana Kumar wrote:
Hi all,
Does Poly/ML include any facility for tracing calls to (certain) functions? I am interested in generating a log of all calls to certain functions (including their arguments), in order, during the run of some program.
Perhaps there is something in the profiler that can help with this?
Cheers, Ramana
polyml mailing list polyml at inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
Thanks David! That looks very promising.
Rather than printing the arguments using displayVal each time, would it be possible to instead print a number identifying the argument value, so that multiple calls to traced functions where some of the arguments are the same re-use the same numbers?
I want to use the trace produced for replaying the sequence of function calls in a context where it is expensive (or sometimes impossible) to reconstruct the arguments from what displayVal prints, but where any value can be saved and associated with a number for later use.
On 12 October 2015 at 19:03, David Matthews <David.Matthews at prolingua.co.uk> wrote:
Hi Ramana, There's nothing specific but the new DebuggingInterface structure should allow you to build this yourself.
First build the new compiler with "make compiler" then compile your function with PolyML.Compiler.debug := true; before it. You don't need to compile your whole program with debugging; just the bit with the function you're interested in.
PolyML.Compiler.debug := false; (* Don't compile this with debugging! *) open PolyML.DebuggerInterface PolyML.NameSpace;
fun trace(fnName, _) = if String.isSubstring "myname" fnName then let val args = debugFunctionArg(hd(debugState(Thread.Thread.self()))) in PolyML.prettyPrint(TextIO.print, 90 (* Line length *)) (displayVal(args, 100 (* Depth *), PolyML.globalNameSpace)) end else (); setOnEntry(SOME trace);
Run your program and every time it enters a function that matches the test it will print the arguments.
The DebuggerInterface structure is still a bit fluid so some things may change before the final release.
David
On 11/10/2015 08:20, Ramana Kumar wrote:
Hi all,
Does Poly/ML include any facility for tracing calls to (certain) functions? I am interested in generating a log of all calls to certain functions (including their arguments), in order, during the run of some program.
Perhaps there is something in the profiler that can help with this?
Cheers, Ramana
polyml mailing list polyml at inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
polyml mailing list polyml at inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
Ramana, Actually after thinking about it, if you can modify your function you can simply add PolyML.print or PolyML.makestring to print the arguments or turn them into a string.
There's no number around that would identify particular arguments. You'll need to construct that yourself. Perhaps I've caused some confusion by comparing the GC sharing phase with hash-consing. The sharing pass gains some of the advantages of hash-consing in reducing the memory requirements but it only applies at the instant when it is run. There's no on-going hashing.
David
On 13/10/2015 02:10, Ramana Kumar wrote:
Thanks David! That looks very promising.
Rather than printing the arguments using displayVal each time, would it be possible to instead print a number identifying the argument value, so that multiple calls to traced functions where some of the arguments are the same re-use the same numbers?
I want to use the trace produced for replaying the sequence of function calls in a context where it is expensive (or sometimes impossible) to reconstruct the arguments from what displayVal prints, but where any value can be saved and associated with a number for later use.