On Fri, Nov 5, 2010 at 4:50 PM, Jong Bor Lee <[email protected]> wrote:
> > > On Fri, Nov 5, 2010 at 1:30 PM, Jong Bor Lee <[email protected]> wrote: > >> I am developing a Gtk application using gtkmm on Windows Vista with Visual >> Studio 2005. The application works fine on the development machine but I >> have received crash reports after it has been run on Windows XP machines >> (both Service Pack 2 and 3). I distribute the app with the directory >> structure described in http://live.gnome.org/gtkmm/MSWindows and it had >> given me no problems so far. >> >> The crash gives no error messages except for Windows asking whether I want >> to report the error. >> >> In order to solve the problem, I tried to compile the program against >> different versions of gtkmm (a recent stable version >> gtkmm-win32-devel-2.16.0-4 and an older version gtkmm-win32-devel-2.10.11-1) >> but the problem persisted. >> >> I hunted down the problem to a call to window->create_cairo_context() >> inside the on_expose_event of a Gtk::DrawingArea. When I commented out this >> call, the problem would disappear. So I wrote the following minimal program, >> which still crashes: >> >> #include <gtkmm.h> >> >> class MyWindow : public Gtk::Window { >> bool on_expose_event(GdkEventExpose* event) { >> std::cout << "expose" << std::endl; >> >> Glib::RefPtr<Gdk::Window> window = get_window(); >> if(window) { >> std::cout << "win" << std::endl; >> std::cout << "Get cairo" << std::endl; >> Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context(); >> std::cout << "Get cairo done" << std::endl; >> } else { >> std::cout << "no win" << std::endl; >> } >> >> return true; >> } >> }; >> >> int main (int argc, char *argv[]) { >> Gtk::Main m(argc,argv); >> MyWindow w; >> m.run(w); >> return 0; >> } >> >> This minimal app may run and display the window without problem, but if I >> move the window off the screen limits or if I minimize/maximize it enough >> times (thus triggering calls to on_expose_event), it will eventually crash. >> It may also be the case that it won't crash the first time, but it will >> crash after restarting the app and triggering multiple calls to >> on_expose_event as described above. One thing I've noticed is that the app >> crashes *after* printing "Get cairo done". When I comment out the call >> to create_cairo_context, the problem dissapears, so I'm pretty sure there is >> something wrong with this line. >> >> The error happens on clean installed Windows XP machines. I have tested >> both apps (original and minimal) on a colleague's notebook, which also has >> Windows XP, but it doesn't crash there. I suppose there is some dependency >> that is available/up to date in our computers but not in the computers where >> the application crashes. I have updated DirectX and installed Visual Studio >> C++ 2005 Redistributable on one of the problematic machines, but the problem >> persists. >> >> The original app, which draws a graph on the DrawingArea, doesn't >> necessarily crash the first time either. It may work fine the first time >> after rebooting, but is more prone to fail the second time. >> >> I am thinking about compiling and testing with MinGW to see if that solves >> the problem. I'll also try to compile a debug version and try to use a >> debugger. I have suspected the version of gdi32.dll might have something to >> do, seeing that libcairo-2.dll depends on this dll according to Dependency >> Walker, but until now it's just an speculation. Other than that, I'm out of >> ideas. >> >> I'll be trying these ideas for the time being. Hopefully someone has more >> suggestions or knows what is going on with the code above. >> >> Thank you, >> Jong Bor. >> >> > I've run the minimal program using WinDbg. Here's the error message: > > HEAP[app_name.exe]: Invalid Address specified to RtlFreeHeap( 00FA0000, > 00F05210 ) > (bb0.a64): Break instruction exception - code 80000003 (first chance) > eax=00f05208 ebx=00f05208 ecx=7c92eb05 edx=0012f2d6 esi=00fa0000 > edi=00f05208 > eip=7c911230 esp=0012f4e0 ebp=0012f4e4 iopl=0 nv up ei pl nz na po > nc > cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 > efl=00000202 > ntdll!DbgBreakPoint: > 7c911230 cc int 3 > > And the stack trace > > WARNING: Stack unwind information not available. Following frames may be > wrong. > ntdll!DbgBreakPoint > ntdll!RtlpNtMakeTemporaryKey+0x6b74 > ntdll!RtlpNtMakeTemporaryKey+0x7d5a > ntdll!RtlInitializeSListHead+0x115c0 > ntdll!iswdigit+0x128 > MSVCR80_940000!free+0xcd > image00400000+0x141d > gtkmm_2_4!Gtk::Widget_Class::expose_event_callback+0x77 > libgtk_win32_2_0_0!gtk_marshal_VOID__UINT_STRING+0x111 > libgobject_2_0_0!g_closure_invoke+0xf6 > libgobject_2_0_0!g_signal_has_handler_pending+0xaf8 > libgobject_2_0_0!g_signal_emit_valist+0x4f7 > libgobject_2_0_0!g_signal_emit+0x1a > libgtk_win32_2_0_0!gtk_widget_activate+0x227. > libgtk_win32_2_0_0!gtk_widget_send_expose+0x149 > libgtk_win32_2_0_0!gtk_main_do_event+0x6d0 > libgdk_win32_2_0_0!gdk_window_clear_area_e+0xd34 > libgdk_win32_2_0_0!gdk_window_process_all_updates+0x7c > libgdk_win32_2_0_0!gdk_window_process_all_updates+0xf3 > libglib_2_0_0!g_source_remove_poll+0x2ca > libglib_2_0_0!g_main_context_acquire+0x55f > libglib_2_0_0!g_main_loop_run+0x159 > libgtk_win32_2_0_0!gtk_main+0xa8 > gtkmm_2_4!Gtk::Main::run+0xc7 > image00400000+0x1b4c > kernel32!RegisterWaitForInputIdle+0x49 > > Seemingly, there is a memory management somewhere (mine or Cairo's, I don't > know). But then, the code is extremely simple, where could there be an > error? I'm suspecting this is an incompatibility of Cairo with Windows, or > some misunderstanding of Gtk programming from me. > Finally, I compiled the whole thing with MinGW g++ and the problem was gone. I guess I shouldn't built Gtk programs with Visual Studio.
_______________________________________________ gtk-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gtk-list
