Как найти несоответствие свободного / удаления, о котором сообщает Valgrind в многопоточной программе? - PullRequest
9 голосов
/ 06 октября 2010

Вот отчет Valgring:

==14546== Thread 5:
==14546== Invalid free() / delete / delete[]
==14546==    at 0x490555D: free (vg_replace_malloc.c:235)
==14546==    by 0x3BF7EFAA8F: free_mem (in /lib64/tls/libc-2.3.4.so)
==14546==    by 0x3BF7EFA581: __libc_freeres (in /lib64/tls/libc-2.3.4.so)
==14546==    by 0x4802676: _vgw_freeres (vg_preloaded.c:62)
==14546==  Address 0x4DC4EE0 is not stack'd, malloc'd or (recently) free'd

Как узнать, какой это поток, так как номер потока варьируется от одного исполнения к другому?Поможет ли присвоение имен моим темам ?

РЕДАКТИРОВАТЬ : Я не думаю, что это произойдет, поскольку это упомянуто в разделе DRD руководства.

Я использую valgrind-3.1.1 на красномШляпа корпоративная Linux AS4.

Ответы [ 3 ]

6 голосов
/ 10 октября 2010

Вы, вероятно, освобождаете глобальную переменную (адрес: 0x4DC4EE0 очень близок к тому месту, где глобальные переменные живут по умолчанию в Linux / x86_64).

Запустите программу из GDB, затем выполните info symbol 0x4DC4EE0,и GDB должен рассказать вам все, что вам нужно знать.

Обновление:
Valgrind 3.6 уже сообщает о глобальном символе.Например, для данной программы с ошибками:

#include <stdlib.h>

int x;

int main()
{
  free(&x);
  return 0;
}

Отчеты Valgrind 3.6:

==18731== Invalid free() / delete / delete[]
==18731==    at 0x4C240E8: free /tmp/vg/coregrind/m_replacemalloc/vg_replace_malloc.c:394
==18731==    by 0x4004AA: main /home/t.c:7
==18731==  Address 0x60089c is 0 bytes inside data symbol "x"
2 голосов
/ 21 декабря 2010

Я наконец нашел объяснение этому: мой исполняемый файл модульного теста был связан с библиотекой [третьей стороны], которую он не использовал. Я снова связал его без этой библиотеки, и проблема исчезла.

Также ошибка была обнаружена в __libc_freeres(), функции gnu libc, которая освобождает ресурсы в конце выполнения. Проблема может быть в библиотеке или в glibc.
Чтобы избежать этой ошибки, можно использовать следующую специфичную для Valgrind Linux опцию : --run-libc-freeres=no. Обратите внимание, что это может сделать обнаружение утечки менее эффективным.

1 голос
/ 06 октября 2010

Вы можете использовать макрос DRD_GET_DRD_THREADID для отображения идентификаторов потоков при запуске потоков. Вы также можете дать имя в печати, чтобы помочь. См. DRD Manual

РЕДАКТИРОВАТЬ Может быть, я не конкретен здесь ... но я думаю, что вам нужно будет ссылаться на некоторые библиотеки valgrind при создании отладочной версии вашего кода (возможно, с опцией компиляции или чем-то еще) , Вы можете использовать DRD_GET_DRD_THREADID из потока и получить имя, которое вы назначили при запуске, - тогда вы можете записать эту информацию в файл или на консоль. Нет способа заставить DRD напечатать имя, которое я не думаю, поэтому вы должны использовать комбо.

...