Re: [Rd] How to debug reference classes?

From: <Mark.Bravington_at_csiro.au>
Date: Fri, 08 Apr 2011 15:33:16 +1000

Righto, thanks-- got it. When it comes to debugging, I'm no purist-- the 'debug' package has to work thru all sorts of undocumented "features" in R, so those of a sensitive disposition are advised _never_ to look at its internal code!

Seems like the following works for mtracing refclass methods (based on completely inadequate experimentation, though):

To 'mtrace' a refclass method 'edit' in a particular object 'xx', after 'xx' has been created:

xx$edit <- xx$edit # a "force"; JC's point that methods are . I will sort this out in 'mtrace' eventually mtrace( edit, from=xx) # now eg xx$edit( 1, 1, 99) will launch debugger mtrace( edit, from=xx, FALSE) # to clear the mtrace-- mtrace.off won't work properly here

To 'mtrace' all subsequent invocations of a method 'edit' in class 'mEditor', in whatever objects of class 'mEditor' subsequently get created:

mtrace( edit, from=mEditor$def_at_refMethods) # now eg xx <- mEditor$new( data=xMat); xx$edit( 5, 5, 99) will launch debugger mtrace( edit, from=mEditor$def_at_refMethods, FALSE) # to clear the mtrace

bye
Mark

Mark Bravington
CSIRO CMIS
Marine Lab
Hobart
Australia



From: r-devel-bounces_at_r-project.org [r-devel-bounces_at_r-project.org] On Behalf Of John Chambers [jmc_at_r-project.org] Sent: 08 April 2011 11:12
To: r-devel_at_r-project.org
Subject: Re: [Rd] How to debug reference classes?

Good to know. However, _please_ don't use the horrible kludge in the attr(..) expression. From my experimenting, it worked fine just to say:

mtrace(edit, from = xx)

and even if that did not work, from = as.environment(xx) is identical in effect to the attr() expression and means something. (Usually the coercion to "environment" happens automatically.)

The attr() expression is strongly deprecated and very much not guaranteed to work. First, it's discouraged to use the .xData slot, which is part of the implementation and not part of the API. And ditto to access _any_ slot by attr(), for the same reason.

However, in my experimenting the technique required xx$edit to have been evaluated at some point before the call to mtrace(). Reference methods are copied to the object when first required (for efficiency). Because my workaround explicitly used xx$edit, the problem didn't arise. Just evaluating xx$edit should be enough.

On the "before instantiated" point. I assume you mean in order to trace the method in all objects generated from the reference class. I had thought about that too. The same mechanism I described in my previous mail works for this as well, but requires a kludge to get the environment containing the methods. The steps I outlined are as before but modified (in the example) as follows:

 > mm =  mEditor$def_at_refMethods
 > edit = mm$edit
 > trace(edit, browser, where = mm)

(mm is the environment with the methods). Then the objects generated by mEditor$new() will have the traced version.

The same technique didn't seem to work for mtrace(), but a modification might.

John

On 4/7/11 4:56 PM, Mark.Bravington_at_csiro.au wrote:
> 'mtrace' will work with reference classes, at least after an object is instantiated. I'm not familiar with the guts of reference classes, but the following quick experiment was successful.. If you run the example in '?ReferenceClasses' up to& including this line :
>
> xx<- mEditor$new(data = xMat)
>
> and then do this:
>
> mtrace( edit, from=attr( xx, '.xData'))
>
> and then run the next line of the example, which is
>
> xx$edit(2, 2, 0)
>
> then the debug window will come up as normal.
>
> Now, what about if you want to mtrace 'edit' before objects are instantiated? Here the S4 structure defeated me temporarily, but I probably would have been able to beat it if I'd had more time... There are some notes on debugging S4 methods in 'package?debug' (note that '?mtrace' itself is out-of-date on S4-- I have gotten S4 debugging to work, but it's only described in 'package?debug') and that might be enough to get you going.
>
> HTH
>
> Mark ('debug' package author)
>
> Mark Bravington
> CSIRO CMIS
> Marine Lab
> Hobart
> Australia
> ________________________________________
> From: r-devel-bounces_at_r-project.org [r-devel-bounces_at_r-project.org] On Behalf Of A Zege [andre.zege_at_gmail.com]
> Sent: 08 April 2011 05:00
> To: r-devel_at_r-project.org
> Subject: [Rd] How to debug reference classes?
>
> How do you debug methods of a reference class? I've been using mtrace, which
> is excellent, but i cannot figure out how to mtrace a reference class
> method. Maybe there is some other way to debug these, for example with
> ordinary trace? for now i am only able to use options(error=recover), which
> is not giving me idea where exactly in the code i am once i am stopped on an
> error.
>
> --
> View this message in context: http://r.789695.n4.nabble.com/How-to-debug-reference-classes-tp3434269p3434269.html
> Sent from the R devel mailing list archive at Nabble.com.
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Fri 08 Apr 2011 - 05:47:34 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 08 Apr 2011 - 07:20:43 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive