[R-pkg-devel] R session crash on closing a graphic device on Windows

Tomas Kalibera tom@@@k@||ber@ @end|ng |rom gm@||@com
Wed Jan 26 15:20:16 CET 2022


Hi Yutani,

if you haven't done that already, I would recommend building R with 
debug symbols (DEBUG=T, so that make file don't strip them) and with -O0 
(no optimizations), so that the debug symbols are more accurate. Without 
that, the stack traces can be very misleading. You might try both with 
windbg and gdb, sometimes one of them provides an extra hint. Ideally 
you would also build the involved package(s) the same way.

Then, it is important to check where the free() is called from, whether 
it is directly or from the GC. In both cases (but more likely in the 
latter), it could be caused by somewhat unrelated memory corruption, 
which may be hard to find - e.g. possibly a PROTECT error. Running with 
gctorture() might help, if gctorture() changes where the crash happens, 
it is more likely a somewhat unrelated memory corruption.

If it were a double-free or similar allocation error inside R itself (or 
some of the involved packages), it would be easy to find with a debugger.

If debugging this way does not help, you can try narrowing down the 
example, while preserving the crash. That may make debugging easier, and 
if you eventually get to a point that you have a reproducible example 
involving only base R and base packages, you know it is a bug in R, and 
can submit that in a bug report for others to debug.

Best
Tomas

On 1/22/22 10:50, Hiroaki Yutani wrote:
> Hi,
>
> I'm trying to create a Rust library that can implement an R graphic
> device[1], but the R session crashes on `dev.off()` on Windows with R
> 4.1.2. Strangely, it works without errors on Linux, on macOS, and even
> on Windows with R-devel.
>
> Looking at the stack trace below by WinDbg, the problem is probably
> that either of the two free()s in GEdestroyDevDesc() tries to free
> some memory that was already freed (I'm a very beginner of this kind
> of debugging, so I might be wrong).
>
>      # Child-SP          RetAddr               Call Site
>      00 00000000`0441cb70 00007ffb`3df0be63     ntdll!RtlReportFatalFailure+0x9
>      01 00000000`0441cbc0 00007ffb`3df14c82
> ntdll!RtlReportCriticalFailure+0x97
>      ...snip...
>      08 00000000`0441cfc0 00007ffb`3c30c6ac     ntdll!RtlFreeHeap+0x51
>      09 00000000`0441d000 00000000`6c7bcf99     msvcrt!free+0x1c
>      0a 00000000`0441d030 00000000`6c79e7de     R!GEdestroyDevDesc+0x59
>      0b 00000000`0441d080 00000000`6fc828e9     R!GEcurrentDevice+0x37e
>      0c 00000000`0441d0f0 00000000`6c7a15fa     grDevices!devoff+0x59
>      ...snip...
>
> But, I found no difference in the related code (around devoff() and
> GEdestroyDevDesc()) between R 4.1.2 and R-devel. I know there are a
> lot of feature additions in R-devel, but I don't think it affects
> here. Is there anyone who suffered from similar crashes? Am I missing
> something?
>
> I would appreciate any advice.
>
> Best,
> Yutani
>
> [1]: https://github.com/extendr/extendr/pull/360
>
> ______________________________________________
> R-package-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel



More information about the R-package-devel mailing list