X11 Error rendering pixbuf cache with large pixbufs.
I think I know the cause as well as the solution. Slightly verbose notes below the stack trace.
This probably reflects a bug in the program.
The error was 'BadAlloc (insufficient resources for operation)'.
(Details: serial 810992 error_code 11 request_code 130 (MIT-SHM) minor_code 5)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the GDK_SYNCHRONIZE environment
variable to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)
Next I used GDK_SYNCHRONIZE and gdb to snag the exact spot it crashed.... Below is the trace.
Thread 1 "[REDACTED]" hit Breakpoint 1, 0x00007ffff666be50 in gdk_x_error () from /usr/lib64/libgdk-3.so.0
(gdb) bt
#0 0x00007ffff666be50 in gdk_x_error () from /usr/lib64/libgdk-3.so.0
#1 0x00007ffff326c25d in _XError () from /usr/lib64/libX11.so.6
#2 0x00007ffff32691b7 in handle_error () from /usr/lib64/libX11.so.6
#3 0x00007ffff326925d in handle_response () from /usr/lib64/libX11.so.6
#4 0x00007ffff326a1a0 in _XReply () from /usr/lib64/libX11.so.6
#5 0x00007ffff3265acd in XSync () from /usr/lib64/libX11.so.6
#6 0x00007ffff3265b6b in _XSyncFunction () from /usr/lib64/libX11.so.6
#7 0x00007ffff326cb6f in _XPrivSyncFunction () from /usr/lib64/libX11.so.6
#8 0x00007ffff31c5c61 in XShmCreatePixmap () from /usr/lib64/libXext.so.6
#9 0x00007ffff6317723 in _cairo_xlib_shm_surface_create.isra.13 () from /usr/lib64/libcairo.so.2
#10 0x00007ffff6318351 in _cairo_xlib_surface_create_shm () from /usr/lib64/libcairo.so.2
#11 0x00007ffff63183dc in _cairo_xlib_surface_create_similar_shm () from /usr/lib64/libcairo.so.2
#12 0x00007ffff62ec443 in cairo_surface_create_similar_image () from /usr/lib64/libcairo.so.2
#13 0x00007ffff62ec628 in cairo_surface_create_similar () from /usr/lib64/libcairo.so.2
#14 0x00007ffff664d5a8 in gdk_window_create_similar_surface () from /usr/lib64/libgdk-3.so.0
#15 0x00007ffff694c951 in _gtk_pixel_cache_draw () from /usr/lib64/libgtk-3.so.0
#16 0x00007ffff69e34a3 in gtk_text_view_draw () from /usr/lib64/libgtk-3.so.0
#17 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#18 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#19 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#20 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#21 0x00007ffff682f7dc in gtk_container_draw () from /usr/lib64/libgtk-3.so.0
#22 0x00007ffff694caea in _gtk_pixel_cache_draw () from /usr/lib64/libgtk-3.so.0
#23 0x00007ffff6a33060 in gtk_viewport_render () from /usr/lib64/libgtk-3.so.0
#24 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#25 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#26 0x00007ffff6a33d6d in gtk_viewport_draw () from /usr/lib64/libgtk-3.so.0
#27 0x00007ffff74c8a0e in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#28 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#29 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#30 0x00007ffff682f7dc in gtk_container_draw () from /usr/lib64/libgtk-3.so.0
#31 0x00007ffff6979c7b in gtk_scrolled_window_render () from /usr/lib64/libgtk-3.so.0
#32 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#33 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#34 0x00007ffff6977fe1 in gtk_scrolled_window_draw () from /usr/lib64/libgtk-3.so.0
#35 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#36 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#37 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#38 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#39 0x00007ffff682f7dc in gtk_container_draw () from /usr/lib64/libgtk-3.so.0
#40 0x00007ffff67e1c74 in gtk_box_draw_contents () from /usr/lib64/libgtk-3.so.0
#41 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#42 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#43 0x00007ffff67e44e1 in gtk_box_draw () from /usr/lib64/libgtk-3.so.0
#44 0x00007ffff74c8a0e in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#45 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#46 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#47 0x00007ffff67e5c0e in gtk_box_gadget_draw () from /usr/lib64/libgtk-3.so.0
#48 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#49 0x00007ffff687f841 in gtk_expander_draw () from /usr/lib64/libgtk-3.so.0
#50 0x00007ffff74c8a0e in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
---Type <return> to continue, or q <return> to quit---
#51 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#52 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#53 0x00007ffff682f7dc in gtk_container_draw () from /usr/lib64/libgtk-3.so.0
#54 0x00007ffff67e1c74 in gtk_box_draw_contents () from /usr/lib64/libgtk-3.so.0
#55 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#56 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#57 0x00007ffff67e44e1 in gtk_box_draw () from /usr/lib64/libgtk-3.so.0
#58 0x00007ffff74c8a0e in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#59 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#60 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#61 0x00007ffff682f7dc in gtk_container_draw () from /usr/lib64/libgtk-3.so.0
#62 0x00007ffff67e1c74 in gtk_box_draw_contents () from /usr/lib64/libgtk-3.so.0
#63 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#64 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#65 0x00007ffff67e44e1 in gtk_box_draw () from /usr/lib64/libgtk-3.so.0
#66 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#67 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#68 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#69 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#70 0x00007ffff6999458 in gtk_stack_render () from /usr/lib64/libgtk-3.so.0
#71 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#72 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#73 0x00007ffff6998ef5 in gtk_stack_draw () from /usr/lib64/libgtk-3.so.0
#74 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#75 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#76 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#77 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#78 0x00007ffff6999458 in gtk_stack_render () from /usr/lib64/libgtk-3.so.0
#79 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#80 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#81 0x00007ffff6998ef5 in gtk_stack_draw () from /usr/lib64/libgtk-3.so.0
#82 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#83 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#84 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#85 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#86 0x00007ffff692b880 in gtk_paned_render () from /usr/lib64/libgtk-3.so.0
#87 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#88 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#89 0x00007ffff692b691 in gtk_paned_draw () from /usr/lib64/libgtk-3.so.0
#90 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#91 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#92 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#93 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#94 0x00007ffff682f7dc in gtk_container_draw () from /usr/lib64/libgtk-3.so.0
#95 0x00007ffff67e1c74 in gtk_box_draw_contents () from /usr/lib64/libgtk-3.so.0
#96 0x00007ffff683487d in gtk_css_custom_gadget_draw () from /usr/lib64/libgtk-3.so.0
#97 0x00007ffff68393f2 in gtk_css_gadget_draw () from /usr/lib64/libgtk-3.so.0
#98 0x00007ffff67e44e1 in gtk_box_draw () from /usr/lib64/libgtk-3.so.0
#99 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#100 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#101 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
---Type <return> to continue, or q <return> to quit---
#102 0x00007ffff682f70a in gtk_container_propagate_draw () from /usr/lib64/libgtk-3.so.0
#103 0x00007ffff682f7dc in gtk_container_draw () from /usr/lib64/libgtk-3.so.0
#104 0x00007ffff6a4ff3a in gtk_window_draw () from /usr/lib64/libgtk-3.so.0
#105 0x00007ffff74be1cc in Gtk::Widget::on_draw(Cairo::RefPtr<Cairo::Context> const&) () from /usr/lib64/libgtkmm-3.0.so.1
#106 0x00007ffff74c8aaf in Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from /usr/lib64/libgtkmm-3.0.so.1
#107 0x00007ffff6a41f14 in gtk_widget_draw_internal () from /usr/lib64/libgtk-3.so.0
#108 0x00007ffff6a4af88 in gtk_widget_render () from /usr/lib64/libgtk-3.so.0
#109 0x00007ffff68faf59 in gtk_main_do_event () from /usr/lib64/libgtk-3.so.0
#110 0x00007ffff6635965 in _gdk_event_emit () from /usr/lib64/libgdk-3.so.0
#111 0x00007ffff6645dbe in _gdk_window_process_updates_recurse_helper () from /usr/lib64/libgdk-3.so.0
#112 0x00007ffff6646f47 in gdk_window_process_updates_internal () from /usr/lib64/libgdk-3.so.0
#113 0x00007ffff66470f8 in gdk_window_process_updates_with_mode () from /usr/lib64/libgdk-3.so.0
#114 0x00007ffff61fbb9d in g_closure_invoke () from /usr/lib64/libgobject-2.0.so.0
#115 0x00007ffff620e9f8 in signal_emit_unlocked_R () from /usr/lib64/libgobject-2.0.so.0
#116 0x00007ffff621792e in g_signal_emit_valist () from /usr/lib64/libgobject-2.0.so.0
#117 0x00007ffff6217fd7 in g_signal_emit () from /usr/lib64/libgobject-2.0.so.0
#118 0x00007ffff663ee95 in gdk_frame_clock_paint_idle () from /usr/lib64/libgdk-3.so.0
#119 0x00007ffff662a328 in gdk_threads_dispatch () from /usr/lib64/libgdk-3.so.0
#120 0x00007ffff611a263 in g_timeout_dispatch () from /usr/lib64/libglib-2.0.so.0
#121 0x00007ffff61197c7 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0
#122 0x00007ffff6119bb8 in g_main_context_iterate.isra () from /usr/lib64/libglib-2.0.so.0
#123 0x00007ffff6119ec2 in g_main_loop_run () from /usr/lib64/libglib-2.0.so.0
#124 0x00007ffff68fa23d in gtk_main () from /usr/lib64/libgtk-3.so.0
#125 0x00007ffff745f7c6 in Gtk::Main::run(Gtk::Window&) () from /usr/lib64/libgtkmm-3.0.so.1
#126 0x00005555558e33af in main (argc=2, argv=0x7fffffffde08) at [REDACTED]:217
I believe I know quite a bit of information that may help.... I have been developing an application using GTKMM and discovered on certain video cards from Intel, that pixbufs larger than the screen tend to cause X11 errors. This has been documented in various places. I was loading 5000x5000 pixel images on a video resolution of 1600x1200 or even smaller.
I eventually realized I can't do this for these systems and after changing my code to avoid creating large pixbufs the crashes went away. Now I ran into it again but this time from internal GTK/GTKMM calls that I can't really control.
In my program I am running a subprocess using signal_io and updating a text_area with it's output. This process scrolls lines extremely fast, so fast that I implemented a tail algorithm to read it in chunks to slow down the line-by-line events preserving the user interface reaction times.
But I realized I am not deleting the past scroll history which I am putting into a TextArea. So this large scrolling text is causing the TextArea to try to cache a large pixbuf which then creates one too large and again produces X11 errors.
I confirmed by instead making my program only store one page's worth of data in the TextArea, deleting past data instead of just appending it..... Now the crash goes away. I confirmed there is no overflow since my first thought was I had too much data in the TextArea, but it was less than 1MB but enough to make a pixbuf larger than the screen. (My stack sizes are much larger). Also confirmed with intel parallel studio and valgrind that stack/heap memory is fine. The pixbuf creation is indeed the culprit.
So if I put lots of data into a TextArea, it eventually tries to create a cached pixbuf that is larger than certain buggy Intel video drivers allow. The solution would be to allow some kind of workaround to prevent creating really large pixbuf caches..... Then for systems with this behavior we could tell GTK/GTKMM not to use pixbufs larger than the screen resolution for caching without having to carefully manage the sizes of things as trivial as a TextArea. Or even just document this more and spread the word.....
Let me know if I can help further. acidtonic@gmail.com