[Rd] a R_PV problem
Gang Liang
gumpleon at gmail.com
Thu May 8 05:36:28 CEST 2008
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:
> On Tue, 6 May 2008, Duncan Murdoch wrote:
>
>
>
> > On 06/05/2008 3:02 AM, pseudo wrote:
> > > 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?
> >
> > 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.
>
> 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."
>
More information about the R-devel
mailing list