Skip to content

a R_PV problem

8 messages · Duncan Murdoch, Antonio, Fabio Di Narzo, Brian Ripley +2 more

#
Dear all,

When using gdb to debug my C code, I use R_PV to show the content of
SEXP variables:

  SEXP sexp; // it is a data.frame
  SEXP colNames = getAttrib(sexp, R_NameSymbol);

A strange thing is that after halting the program:

  (gdb) p R_PV(colNames)

does not show the content of colNames. I am positive my code is right
because if I insert "PrintValue(colNames);" in the c code, it will
print the right value. My debug result shows that the variable
"colNames" failed the "isObject" call. I am not sure whether this is a
new feature or bug. Anyone can help?

Thanks,

Gang Liang
#
On 06/05/2008 3:02 AM, pseudo wrote:
Are you sure that getAttrib has been called?  Depending on the 
optimization level under which your code was compiled, instructions may 
be re-ordered.  gdb may show the instruction pointer after that line, 
even though that line hasn't been run yet.

Duncan Murdoch
#
2008/5/6 pseudo <gumpleon at gmail.com>:
[...]
Have you tried:
p Rf_PrintValue(colNames)
from the gdb prompt?

A.
#
/* Ditto, but only for objects, for use in debugging */

so R_PV only prints for 'objects' (that is those with an S3 class, and if 
properly formed, those with an S4 class).  I doubt a set of names has a 
class: to print those, use Rf_PrintValue.

I am not sure why one would want to confine attention to 'objects', but 
the code has been that way 'for ever' (8 years).
On Tue, 6 May 2008, Duncan Murdoch wrote:

            

  
    
#
On Tue, May 6, 2008 at 1:46 AM, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
Yes, the getAttrib is called because the optimization is turned off.

Gang
#
On Tue, 6 May 2008, Duncan Murdoch wrote:

            
R_PV(sexp) only prints if isObject(sexp) is true, i.e., if it
is "internally classed".  Try using Rf_PrintValue(colNames) from
the debugger.

src/main/print.c contains:
   /* Print an S-expression using global options */
   void PrintValue(SEXP s)
   {
       PrintValueEnv(s, R_GlobalEnv);
   }
   /* Ditto, but only for objects, for use in debugging */
   void R_PV(SEXP s)
   {
       if(isObject(s)) PrintValueEnv(s, R_GlobalEnv);
   }
and include/Internals.h has the usual add-Rf_ #define:
   #define PrintValue              Rf_PrintValue

----------------------------------------------------------------------------
Bill Dunlap
Insightful Corporation
bill at insightful dot com
360-428-8146

 "All statements in this message represent the opinions of the author and do
 not necessarily reflect Insightful Corporation policy or position."
#
On Tue, May 6, 2008 at 5:23 AM, Antonio, Fabio Di Narzo
<antonio.fabio at gmail.com> wrote:
Yes, I also tried "p Rf_PrintValue(colNames)", the outcome is the
same. I can step in the r-base-core and what I found is that the
"isObject" returns false.
1 day later
#
Thanks for the pointer, and the problem solved.

I double checked that Rf_PrintValue works when the option
"unwindonsignal" is turned on in gdb. I also found that without "set
unwindonsignal on", both "p Rf_PrintValue(colNames)" and "p
R_PV(colNames)" could result in SIGTRAP or SIGSEGV sometimes. But not
sure what caused the signal and why... because if I stepped into these
functions, nothing would happen.

Thanks, Gang
On Tue, May 6, 2008 at 8:30 AM, Bill Dunlap <bill at insightful.com> wrote: