Linux c ошибками и утечками мьютексной памятиLinux

Ответить
Anonymous
 Linux c ошибками и утечками мьютексной памяти

Сообщение Anonymous »

Я определяю pthread_mutex_t в общей библиотеке объектов, инициализирую его в процессе и использую в функции библиотеки. Следование структуре кода. Под процессами я подразумеваю отдельные работающие двоичные файлы. Учтите, что запускается несколько потоков, которые запускают function_thread.
Я использую systat и sa для профилирования использования ресурсов и заметил, что память, используемая процессом2, постоянно увеличивается, как будто есть утечка памяти. .
Затем я запускаю процесс2 с помощью Valgrind и сообщаю о результатах. Если я удалю pthread_mutex, ошибки исчезнут. Слово futex в сообщениях об ошибках подсказывает мне, что они вызваны мьютексом. Я делаю что-то не так в коде? Имеет ли смысл объявлять переменную в общей библиотеке, а затем использовать ее в потоках других двоичных файлов?
lib.c:
pthread_mutex_t xwebwd_mutex;

int function_foo() {
...
if (pthread_mutex_trylock(&xwebwd_mutex) == 0) {

pthread_mutex_unlock(&xwebwd_mutex);
}
...
}

process1.c:
extern pthread_mutex_t xwebwd_mutex;

int main() {
...
pthread_mutex_init(&xwebwd_mutex, NULL);
...
pthread_mutex_destroy(&xwebwd_mutex);
return 0;
}

process2.c:
...
function_thread() {
function_foo();
}
...

==4581== Invalid read of size 4
==4581== at 0x4BDDA18: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== Invalid write of size 4
==4581== at 0x4BDDA20: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== Syscall param futex(futex) points to unaddressable byte(s)
==4581== at 0x50B0EC0: syscall (in /lib/libc.so.6)
==4581== by 0x4BDDA47: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== HEAP SUMMARY:
==4581== in use at exit: 38,235 bytes in 359 blocks
==4581== total heap usage: 115,927 allocs, 115,568 frees, 23,682,340 bytes allocated
==4581==
==4581== Searching for pointers to 338 not-freed blocks
==4581== Checked 8,776,812 bytes
==4581==
==4581== Thread 1:
==4581== 160 bytes in 1 blocks are possibly lost in loss record 1 of 6
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 584 bytes in 56 blocks are still reachable in loss record 2 of 6
==4581== at 0x4864CB8: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 1,008 bytes in 21 blocks are still reachable in loss record 3 of 6
==4581== at 0x4C8D7F0: type_node_any_new_W (in /usr/lib/libgobject-2.0.so.0.7200.3)
==4581==
==4581== 9,613 bytes in 21 blocks are still reachable in loss record 4 of 6
==4581== at 0x486ADA8: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 10,400 bytes in 151 blocks are still reachable in loss record 5 of 6
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== 15,378 bytes in 88 blocks are still reachable in loss record 6 of 6
==4581== at 0x4864DE4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== LEAK SUMMARY:
==4581== definitely lost: 0 bytes in 0 blocks
==4581== indirectly lost: 0 bytes in 0 blocks
==4581== possibly lost: 160 bytes in 1 blocks
==4581== still reachable: 36,983 bytes in 337 blocks
==4581== suppressed: 0 bytes in 0 blocks
==4581==
==4581== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 0 from 0)
==4581==
==4581== 1 errors in context 1 of 4:
==4581== Thread 2 dbus8528695976:
==4581== Syscall param futex(futex) points to unaddressable byte(s)
==4581== at 0x50B0EC0: syscall (in /lib/libc.so.6)
==4581== by 0x4BDDA47: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== 2 errors in context 2 of 4:
==4581== Invalid write of size 4
==4581== at 0x4BDDA20: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581==
==4581== 2 errors in context 3 of 4:
==4581== Invalid read of size 4
==4581== at 0x4BDDA18: g_cond_signal (in /usr/lib/libglib-2.0.so.0.7200.3)
==4581== Address 0x5d7d90c is 36 bytes inside a block of size 124 free'd
==4581== at 0x4867E54: free (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581== Block was alloc'd at
==4581== at 0x486AAA8: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==4581==
==4581== ERROR SUMMARY: 6 errors from 4 contexts (suppressed: 0 from 0)


Подробнее здесь: https://stackoverflow.com/questions/789 ... s-and-leak
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»