BadAlloc и сбой в программе wxWidgets. Как найти ошибку?
У нас есть довольно большая кроссплатформенная программа C++, работающая на wxWidgets. Недавно большой кусок кода был перенесен из windows в linux, и с тех пор программа выходит из строя при отображении всплывающего диалога. Сообщение об ошибке выводится на консоль следующим образом:
The program 'program name' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadAlloc (insufficient resources for operation)'.
(Details: serial 12425 error_code 11 request_code 53 minor_code 0)
(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 --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)
libxcb: WARNING! Program tries to lock an already locked connection,
which indicates a programming error.
There will be no further warnings about this issue.
Шагая через код с отладчиком, оскорбительные строки кажутся такими:
wxBitmap* maskBmp = new wxBitmap(iconPath, wxBITMAP_TYPE_BMP);
wxMask* mask = new wxMask(*maskBmp, wxColour(255, 0, 255));
После второй строки в crashes. Растровые изображения, по-видимому, загружаются правильно, так как те же значки используются в другом месте панель инструментов без каких-либо проблем. Я попытался выполнить отладку с помощью "--sync", как следует из сообщения об ошибке, но это, похоже, не очень помогает, так как gdb не может поставить точку останова на функцию gdk_x_error ().
Есть ли идеи о том, откуда может исходить ошибка или, по крайней мере, как ее отследить?
Спасибо
UPDATE: обратите внимание, что я получаю журнал ошибок утверждения xWindows, таких как:
(main:5322): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed
(main:5322): Gdk-CRITICAL **: gdk_drawable_get_image: assertion `GDK_IS_DRAWABLE (drawable)' failed
(main:5322): Gdk-CRITICAL **: gdk_image_get_colormap: assertion `GDK_IS_IMAGE (image)'failed
(main:5322): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed
Но это, кажется, происходит все время, даже когда программа работает хорошо!2 ответа:
Критические предупреждения GTK определенно не являются хорошей вещью и часто указывают на проблему, поэтому не думайте, что ваша программа работает хорошо, когда вы их видите. Вы можете отладить их, поставив точку останова на функции
g_log
в gdb и посмотрев на обратную трассу, когда вы туда попадете.Кроме того, если вы можете воспроизвести сбой с использованием неправильного файла с помощью
wxMask
в простом примере, пожалуйста, рассмотрите возможность отправки сообщения об ошибке в http://trac.wxwidgets.org/