[Rcpp-devel] FW: simple patch to fix stack overflow in RInside v. 2011-12-06 23:47:21
Dirk Eddelbuettel
edd at debian.org
Tue Jan 3 01:20:40 CET 2012
On 2 January 2012 at 15:27, john brzustowski wrote:
| Hi Dirk,
|
| On 2 January 2012 at 11:29, Dirk Eddelbuettel wrote:
| >...
| > On 2 January 2012 at 12:55, John Brzustowski wrote:
| >...
| > | Second, below is a small patch to fix a stack overflow under Windows.
| > | The problem is that the myWriteConsole callback is recursively invoking itself
| > | via Rprintf. With this patch, the programs in examples/standard all run correctly.
| >
| > I test them all pre-release on on XP 32bit and they worked for me. What is
| > your platform?
|
| Windows 7 Home Edition, 64-bit.
|
| > | =========================================
| > | diff -r RInside/src/RInside.cpp RInside_patched/src/RInside.cpp
| > | 72c72,73
| > | < Rprintf("%s", buf);
| > | ---
| > | > fwrite(buf, sizeof(char), len, stdout);
| > | > fflush(stdout);
| >
| >
| > I'll take another look when I am back in the office. And maybe we could use
| > strnprintf followed by Rprintf here...
| >
| > On which platforms are you seeing issues?
|
| I'm compiling with (32-bit) Rtools 2.14 under MinGW, and using R
| 2.14.1 (32-bit). This problem does not occur under Linux (ubuntu
| 11.10); my patch only affects code conditionally compiled for Win32.
|
| I believe this is the same issue as Diomidis Spinellis is having. When I first
| compiled and ran the examples/standard programs, most would cause an abnormal
| termination. With gdb, the stack trace looked like this:
|
| #0 0x6c976f42 in trio_strerror () from c:\R\R-2.14.1\bin\i386\R.dll
| #1 0x6c94d526 in trio_vsnprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #2 0x6c770f72 in Rcons_vprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #3 0x6c7d04bc in R_tryEvalSilent () from c:\R\R-2.14.1\bin\i386\R.dll
| #4 0x6c77104d in Rvprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #5 0x6c7710a8 in Rprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #6 0x6c770f90 in Rcons_vprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #7 0x6c7d04bc in R_tryEvalSilent () from c:\R\R-2.14.1\bin\i386\R.dll
| #8 0x6c77104d in Rvprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #9 0x6c7710a8 in Rprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #10 0x6c770f90 in Rcons_vprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #11 0x6c7d04bc in R_tryEvalSilent () from c:\R\R-2.14.1\bin\i386\R.dll
| #12 0x6c77104d in Rvprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| #13 0x6c7710a8 in Rprintf () from c:\R\R-2.14.1\bin\i386\R.dll
| ... (many repeats of previous 4 lines)
| #986 0x6c770f90 in Rcons_vprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #987 0x6c7d04bc in R_tryEvalSilent () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #988 0x6c77104d in Rvprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #989 0x6c7710a8 in Rprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #990 0x6c770f90 in Rcons_vprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #991 0x6c7d04bc in R_tryEvalSilent () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #992 0x6c77104d in Rvprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #993 0x6c7710a8 in Rprintf () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #994 0x6c83ae0c in Rf_formatComplex () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #995 0x6c79044e in R_CleanTempDir () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #996 0x6c79a601 in Rf_eval () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #997 0x6c79d8bc in Rf_applyClosure () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #998 0x6c79a8a3 in Rf_eval () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #999 0x6c7cc705 in R_RestoreGlobalEnvFromFile () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #1000 0x6c7cc838 in R_RestoreGlobalEnvFromFile () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #1001 0x6c7cdd15 in R_tryEval () from /cygdrive/c/R/R-2.14.1/bin/i386/R.dll
| #1002 0x00401bdb in ?? ()
| #1003 0x02bcf764 in ?? ()
| #1004 0x00000000 in ?? ()
|
| After re-compiling RInside from source with debugging enabled, the new
| stack trace showed that Rprintf was indirectly invoking itself via the
| myWriteConsole() function in file RInside.cpp (sorry, I don't have
| that stack trace handy). The termination appeared due to a stack
| overflow, and I wrote the patch on that assumption. It seems that one
| can't call a high level R print function (Rprintf) from inside a
| console callback, but I haven't had time to verify this.
Very good work. While I was out and about, James (the author of most helpful
Windows patch which restored functionality) also sent me a patch replacing
Rprintf with fputs. I think you hit nail on the hand re the recursive calls
of Rprintf. James suggestion was:
72c72
< Rprintf("%s", buf);
---
> fputs(buf, stdout);
Could you (and/or Diomidis) try this and see if this helps with the 64bit
issues?
Dirk, very excited about all the recent help for, and interest in, RInside
| Cheers,
|
| John B.
| #-------------------------------------------------------------------------------
| # John Brzustowski
| # 14 Hillcrest Ave., Wolfville, NS B4P 1T4 Canada
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
--
"Outside of a dog, a book is a man's best friend. Inside of a dog, it is too
dark to read." -- Groucho Marx
More information about the Rcpp-devel
mailing list