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 2

2 ответа:

Критические предупреждения GTK определенно не являются хорошей вещью и часто указывают на проблему, поэтому не думайте, что ваша программа работает хорошо, когда вы их видите. Вы можете отладить их, поставив точку останова на функции g_log в gdb и посмотрев на обратную трассу, когда вы туда попадете.

Кроме того, если вы можете воспроизвести сбой с использованием неправильного файла с помощью wxMask в простом примере, пожалуйста, рассмотрите возможность отправки сообщения об ошибке в http://trac.wxwidgets.org/

Ну, я нашел его, используя "-- sync " и шагая через программу. Проблема заключалась просто в пути, заданном конструктору wxMask. Если тот же неправильный путь указан для wxBitmap, он просто выскакивает сообщение об ошибке, но wxMask не так дружелюбен.