Viewing R objects in gdb
On Wed, 29 Jun 2005, Duncan Murdoch wrote:
On 6/29/2005 2:06 PM, Luke Tierney wrote:
On Wed, 29 Jun 2005, Duncan Murdoch wrote:
I'm trying to track down a bug in some experimental code, where an object's attribute is getting messed up. This means I'd like to examine R objects while within gdb. One of the things I'd like to do is to examine the names of all the attributes. This is exactly what an example in the R Extensions manual section 4.11.2 "Inspecting R objects when debugging" does, but the code there doesn't work, presumably because the R internals have changed since it was written. Specifically, I get (gdb) p $a->u.listsxp.tagval->u.symsxp.pname->u.vecsxp.type.c Error: There is no member named vecsxp.
Something like this I think (untested):
p ((VECSEXP)$a->u.listsxp.tagval->u.symsxp.pname)->vecsxp.type.c
That gets the typecast right, but now I have the problem that currently
vecsxp doesn't have a type member:
(gdb) p ((VECSEXP)$a->u.listsxp.tagval->u.symsxp.pname)->vecsxp.type.c
Error: There is no member named type.
(gdb) p ((VECSEXP)$a->u.listsxp.tagval->u.symsxp.pname)->vecsxp
$1 = {length = 5, truelength = 6957219}
I guess I need to write a function that uses the macros to extract the data
(since gdb doesn't see the macros). Or do we already have one?
The type fiels it in the sxpinfo part of the header; I think either ((VECSEXP)$a->u.listsxp.tagval->u.symsxp.pname)->sxpinfo.type or $a->u.listsxp.tagval->u.symsxp.pname->sxpinfo.type will give you that. It is probably possible to do something like write a file of gdb macros, run the C pre-processor over it to get the expnansions, and load that into gdb. Not that I've tried... luke
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa Phone: 319-335-3386
Department of Statistics and Fax: 319-335-3017
Actuarial Science
241 Schaeffer Hall email: luke at stat.uiowa.edu
Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu