LINUX.ORG.RU

Ubuntu 8.04 beta: простейшее приложение GTK+ и valgrind


0

0

Всем привет. Пишем простейшее приложение на GTK+:

#include <gtk/gtk.h>

int
main (int argc, char *argv[])
{
  GtkWidget *window;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);
  gtk_widget_show (window);

  gtk_main ();
  return 0;
}

Собираем: gcc -g -O0 -Wall -pedantic `pkg-config --cflags --libs gtk+-2.0` main.c -o main

Натравливаем на него valgrind:

Invalid read of size 4
==26978==    at 0x4015209: (within /lib/ld-2.7.so)
==26978==    by 0x4005C69: (within /lib/ld-2.7.so)
==26978==    by 0x4007A97: (within /lib/ld-2.7.so)
==26978==    by 0x4011543: (within /lib/ld-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4010F5D: (within /lib/ld-2.7.so)
==26978==    by 0x4731291: (within /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4731454: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x470B186: __nss_lookup_function (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x470B29F: (within /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x470D075: __nss_passwd_lookup (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==  Address 0x4bc8284 is 36 bytes inside a block of size 38 alloc'd
==26978==    at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==26978==    by 0x4008031: (within /lib/ld-2.7.so)
==26978==    by 0x4011543: (within /lib/ld-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4010F5D: (within /lib/ld-2.7.so)
==26978==    by 0x4731291: (within /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4731454: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x470B186: __nss_lookup_function (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x470B29F: (within /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x470D075: __nss_passwd_lookup (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x46B7B72: getpwnam_r (in /lib/tls/i686/cmov/libc-2.7.so)
==26978== 
==26978== Invalid read of size 4
==26978==    at 0x4015237: (within /lib/ld-2.7.so)
==26978==    by 0x4005C69: (within /lib/ld-2.7.so)
==26978==    by 0x4007A97: (within /lib/ld-2.7.so)
==26978==    by 0x400BC16: (within /lib/ld-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x400BDF9: (within /lib/ld-2.7.so)
==26978==    by 0x40115A3: (within /lib/ld-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4010F5D: (within /lib/ld-2.7.so)
==26978==    by 0x4731291: (within /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4731454: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==  Address 0x4bc85cc is 28 bytes inside a block of size 31 alloc'd
==26978==    at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==26978==    by 0x4008031: (within /lib/ld-2.7.so)
==26978==    by 0x400BC16: (within /lib/ld-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x400BDF9: (within /lib/ld-2.7.so)
==26978==    by 0x40115A3: (within /lib/ld-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4010F5D: (within /lib/ld-2.7.so)
==26978==    by 0x4731291: (within /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x400D5D5: (within /lib/ld-2.7.so)
==26978==    by 0x4731454: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.7.so)
==26978==    by 0x470B186: __nss_lookup_function (in /lib/tls/i686/cmov/libc-2.7.so)

-- и ещё много похожих ругательств --

==27164== ERROR SUMMARY: 10 errors from 9 contexts (suppressed: 99 from 1)
==27164== malloc/free: in use at exit: 253,147 bytes in 3,181 blocks.
==27164== malloc/free: 10,472 allocs, 7,291 frees, 706,786 bytes allocated.
==27164== For counts of detected errors, rerun with: -v
==27164== searching for pointers to 3,181 not-freed blocks.
==27164== checked 582,764 bytes.

Откуда столько ошибок? Development branch?
★★★★

Ответ на: комментарий от Legioner

Ну так ведь ещё и утечек показывает в много, правда если добавить --leak-check=full, то меньше. Помню в старой доброй генте не было ни ругательств, ни утечек на таком примере.

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от Bohtvaroh

Имхо поэтому и показывает.

А вообще куча библиотек этим страдают. Кстати, если не вся память освобождается, это не всегда утечка, иногда это особенности аллокаторов.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Вот именно, что утечки выявляются не в GTK+ или glib, а именно внутри libc. Остаётся надеятся, что к стабильному выпуску это исправят, за последние дня три пакет libc обновлялся три раза.

Просто это несколько неприятно и мешает анализу утечек внутри своих изделий. :)

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от cathode

Это не то, ибо у меня к счастию не amd64. :)

Bohtvaroh ★★★★
() автор топика

В общем "решил" проблему созданием файла с suppression-ами.

Bohtvaroh ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.