BadAlloc и сбой в программе wxWidgets.Как найти ошибку? - PullRequest
2 голосов
/ 11 января 2010

У нас довольно большая кроссплатформенная программа на 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));

После второй строки вылетает. Кажется, что растровые изображения загружаются правильно, так как те же значки используются в других местах на панели инструментов без проблем. Я попытался отладить с помощью «--sync», как следует из сообщения об ошибке, но, похоже, это не очень помогает, так как gdb не может поставить точку останова на функцию gdk_x_error ().

Есть идеи о том, откуда может исходить ошибка, или, по крайней мере, как ее отследить?

Спасибо

ОБНОВЛЕНИЕ: обратите внимание, что я получаю журнал ошибок утверждений 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 ]

1 голос
/ 11 января 2010

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

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

0 голосов
/ 11 января 2010

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

...