2016-08-09 2 views
0

Ich rufe ein gemeinsames Objekt in C von einem R Wrapper über die .C. Der Code C verursacht Segmentierungsfehler, und ich möchte gdb verwenden, um diesen Code zu debuggen.gdb mit mit der .C-Schnittstelle (gemeinsames Objekt)

Ist es möglich, gdb mit der .C-Schnittstelle zu verwenden?

Ich bin auf MAC OSX 10.11.3

+0

Ich sehe nicht, warum nicht. Haben Sie versucht, R im Debug-Modus zu starten ('R --debugger = gdb')? – nrussell

+0

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? –

+0

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

Antwort

2

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);