Skip to content

Replaying a recorded plot (mixed base and grid) from pdf() in cairo_pdf() crashes R

6 messages · Yihui Xie, Paul Murrell

#
Hi,

I wonder if this is expected or I'm doing a wrong thing.

pdf()
dev.control('enable')

library("grid")
plot(1)
grid.text("A")

res = recordPlot()
dev.off()

cairo_pdf()
replayPlot(res)
dev.off()


 *** caught segfault ***
address 0x4, cause 'memory not mapped'
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.3

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] tools_3.3.2 yaml_2.1.14

Regards,
Yihui
--
https://yihui.name
#
A quick follow-up: I just used cairo_pdf() as the recording device,
and it crashes R as well, so it is probably not relevant to pdf() but
an issue specific to cairo_pdf().

cairo_pdf()
dev.control('enable')

library("grid")
plot(1)
grid.text("A")

res = recordPlot()
dev.off()

cairo_pdf()
replayPlot(res)
dev.off()


Regards,
Yihui
--
https://yihui.name
On Mon, Feb 20, 2017 at 10:24 AM, Yihui Xie <xie at yihui.name> wrote:
#
Hi

I see it too.  No, it is not supposed to do that (!).
Will take a look.  Thanks for reporting!

Paul
On 21/02/17 05:30, Yihui Xie wrote:

  
    
#
Hi

This appears to be happening (at least) because cairo_pdf() delays 
initialising a Cairo surface until BM_NewPage(), rather than 
initiliasing a Cairo surface in BM_Open(), and replayPlot() triggers 
some activity (set clip region) on the device BEFORE a new page is 
started (so the pointer to the Cairo surface is null, so BOOM).

Not sure yet whether to blame replayPlot() for not starting with a new 
page operation OR to blame cairo_pdf() for not initialising a Cairo 
surface at device startup.

If anyone who knows more about Cairo (or cairo_pdf()) wants to point out 
a good reason for the way cairo_pdf() currently works, please don't hold 
back.

Paul
On 21/02/17 05:30, Yihui Xie wrote:

  
    
1 day later
#
Hi

I decided to blame cairo_pdf().

There is a fix in r-devel (r72242) that works for the reported case, 
plus some basic sanity checks.

I could not complete 'make check-devel' because it was failing on 
reg-tests-1d.R ...

 > stopifnot(length(fd) == 10, identical(fd, format(dct <- 
as.POSIXct(dlt))))
Error: identical(fd, format(dct <- as.POSIXct(dlt))) is not TRUE

... anyone else seeing that ?

I would appreciate confirmation from a heavier user of cairo_pdf() that 
I have not broken anything.

Paul
On 21/02/17 08:27, Paul Murrell wrote:

  
    
#
Thanks a lot! I don't use cairo_pdf() very often. I discovered this
problem because a user reported an issue with cairo_pdf() in knitr,
and I found it was reproducible without using knitr.

Regards,
Yihui
--
https://yihui.name
On Tue, Feb 21, 2017 at 5:32 PM, Paul Murrell <paul at stat.auckland.ac.nz> wrote: