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
a R_PV problem
8 messages · Duncan Murdoch, Antonio, Fabio Di Narzo, Brian Ripley +2 more
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. Duncan Murdoch
2008/5/6 pseudo <gumpleon at gmail.com>: [...]
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.
Have you tried: p Rf_PrintValue(colNames) from the gdb prompt? A.
Antonio, Fabio Di Narzo Ph.D. student at Department of Statistical Sciences University of Bologna, Italy
From the C code:
/* 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 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. Duncan Murdoch
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
On Tue, May 6, 2008 at 1:46 AM, Duncan Murdoch <murdoch at stats.uwo.ca> 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.
Yes, the getAttrib is called because the optimization is turned off. Gang
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."
On Tue, May 6, 2008 at 5:23 AM, Antonio, Fabio Di Narzo
<antonio.fabio at gmail.com> wrote:
2008/5/6 pseudo <gumpleon at gmail.com>: [...]
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.
Have you tried: p Rf_PrintValue(colNames) from the gdb prompt?
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.
A. -- Antonio, Fabio Di Narzo Ph.D. student at Department of Statistical Sciences University of Bologna, Italy
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:
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."