From gumpleon at gmail.com  Thu May  8 05:36:28 2008
From: gumpleon at gmail.com (Gang Liang)
Date: Wed, 7 May 2008 20:36:28 -0700
Subject: [Rd] a R_PV problem
In-Reply-To: <Pine.GSO.4.56.0805060827020.11494@devsun3201.insightful.com>
References: <bc33365a0805060002w316d0c92mf2598adfd076ef07@mail.gmail.com>
	<48201AE8.2060501@stats.uwo.ca>
	<Pine.GSO.4.56.0805060827020.11494@devsun3201.insightful.com>
Message-ID: <bc33365a0805072036m3561428eof7f8712f09ec541c@mail.gmail.com>

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."
>



[Rd] a R_PV problem
Gang Liang