Random crash in cairo via gtk/gdk under win32

"Anton Fedorov" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Hello!

I'm seems to be in stuck.
My app randomly crashes, rare (around 1 times per 2 days avg), but i can't get why.

Windows shows that in its crash log:
Module:   libcairo-2.dll
Module timestamp:   4ecb6fdf
Exception code: c0000005
Exception offset:    000205bd
Additional information 1:  0a9e
Additional information 2:  0a9e372d3b4ad19135b953a78882e789
Additional information 3:  0a9e
Additional information 4:  0a9e372d3b4ad19135b953a78882e789
Code:    3658371899

I have enabled minidumps, but that doesn't help much.
Minidump prepared in several ways attached.

I have used gtk all-in-one bundle, so there no .pdb symbols to get info; BUT.

crash is at: libcairo_2!cairo_image_surface_get_data+0x9
disasm at that place:
  Wine-dbg>disas
  0x02fa05bd: cmpl	$0x3073e20,0x0(%eax)
  0x02fa05c3: jnz	0x02fa05d0
  0x02fa05c5: movl	0x108(%eax),%eax
  0x02fa05cb: leave
  0x02fa05cc: ret
  0x02fa05cd: leal	0x0(%esi),%esi
  0x02fa05d0: movl	$0xd,0x0(%esp)
  0x02fa05d7: call	0x02f8d924
  0x02fa05dc: xorl	%eax,%eax
  0x02fa05de: leave

So it seems, that crash itself on cast at line:
   cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface

And argument is zero ( EAX:00000000 ).

According to stack backtrace, call to it from gdk:
  0:000> dds ebp
  0018ef68  0018f3f8
  0018ef6c  6c38d268 libgdk_win32_2_0_0!gdk_window_set_startup_id+0x3144

But since i haven't symbol codes, i'm unsure exact place.

    find . -name '*.c' | xargs grep cairo_image_surface_get_data
in gtk sources gives only one place, from where call can be:
   gdk/win32/gdkpixmap-win32.c

In function  GdkPixmap* _gdk_pixmap_new
  if (depth != 15 && depth != 16)
  {
    ....
      /* Cairo_win32_surface_get_image() returns NULL on failure, but
         this is likely an oversight and future versions will return a
         "nil" surface.
       */
      image_surface = cairo_win32_surface_get_image (dib_surface);
      if (image_surface == NULL ||
          cairo_surface_status (image_surface) != CAIRO_STATUS_SUCCESS)
      {
        cairo_surface_destroy (dib_surface);
        g_object_unref ((GObject*) pixmap);
        return NULL;
      }
      bits = cairo_image_surface_get_data (image_surface);
  }

According to that code, cairo_image_surface_get_data called only if
cairo_win32_surface_get_image successfully returned some surface.

And there i can't understand now how that possible -- get_data called with zero
argument (eax=0), but it can't be called with zero argument (if
image_surface==NULL => return NULL).

Plus, crash occurs randomly, i can't create stable reproduce environment, and it
never occurs in test env -- only on production :(

May be anyone know how/where/way to debug/found sqrt(evil_bug) ?

-- 
Regards,
Anton Fedorov
Call2ru service
E-Mail: [email protected]
Jabber: [email protected]
Skype: datacompboy
ICQ: 272-35-262
Mobile: +7-913-925-7974 [SMS 24h, Call 05:00-19:00 MSKT (GMT+3)]

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
himlab4.exe.4884.log.gz (application/x-gzip, 16.8 KB) - not displayed
himlab4.exe.4884.log2.gz (application/x-gzip, 4.4 KB) - not displayed
himlab4.exe.4884.log3.gz (application/x-gzip, 7.2 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.