Ob Code über .C
oder .Call
zusammengestellt fordern sollte eine R-Sitzung debuggen über gdb
nicht WRT Rolle. Als Beispiel betrachten wir den Code, unter dem absichtlich ein segfault verursacht (auf meinem System) durch einen Null-Zeiger zu dereferenzieren:
#include <R.h>
#include <stdio.h>
#include <string.h>
void rtest(void)
{
int* p = NULL;
printf("%d\n", *p);
}
Kompilieren dies mit R CMD SHLIB rtest.c
und starten R entweder von
R -d /path/to/gdb
R --debugger=/path/to/gdb
Oder, wenn gdb
ist auf Ihrem PATH
, Sie brauchen nicht den vollständigen Dateipfad oben. Auf jeden Fall starten Sie die R-Sitzung:
[email protected]:/tmp$ R --debugger=gdb
#GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
#Copyright (C) 2014 Free Software Foundation, Inc.
#License GPLv3+: GNU GPL version 3 or later
#
# omitted
#
#Reading symbols from /usr/local/lib/R/bin/exec/R...done.
#
(gdb) r
laden dann die gemeinsame Bibliothek, rufen Sie die Funktion, und gehen Sie mit Ihrem Debug-Sitzung:
dyn.load("rtest.so")
f <- function() .C("rtest")
f()
#Program received signal SIGSEGV, Segmentation fault.
#rtest() at rtest.c:8
#8 printf("%d\n", *p);
Ich sehe nicht, warum nicht. Haben Sie versucht, R im Debug-Modus zu starten ('R --debugger = gdb')? – nrussell
Ich bin ein wenig verwirrt, da ich gewohnt bin, dem 'gdb' Befehl durch eine ausführbare Datei zu folgen. Wenn ich 'R --debugger = gdb' mache, öffnet sich R (es gibt keine' (dgb) 'Eingabeaufforderung). Ich kann dann quelle() meine R.wrapper und es führt, aber ich habe nicht die gdb-Schnittstelle. Genau wie zuvor erreichen wir den Segmentierungsfehler in der Mitte des "C" -Codes und ich erhalte eine Nachricht von "R", die mich über den Segmentierungsfehler informiert. Es sah einfach so aus als wäre es vorher. Kannst du mir helfen? –
Sie haben definitiv 'gdb' installiert oder? Auf welchem Betriebssystem sind Sie auch? 'gdb' hätte direkt mit dem obigen Befehl beginnen sollen; Ich werde in einer Minute ein ausführlicheres Beispiel hinzufügen, um dies zu demonstrieren. – nrussell