Объявление задачи Ada вызывает утечку памяти - PullRequest
2 голосов
/ 04 марта 2012

У меня есть следующая маленькая программа Ада:

procedure Leaky_Main is 
   task Beer;
   task body Beer is 
   begin 
      null;
   end Beer;
begin 
   null;
end Leaky_Main;

Все довольно просто, но когда я скомпилирую вот так:

gnatmake -g -gnatwI leaky_main.adb

и запустите его через Valgrind так:

valgrind --tool=memcheck -v --leak-check=full --read-var-info=yes --leak-check=full --show-reachable=yes ./leaky_main

Я получаю следующее резюме ошибки:

==2882== 2,104 bytes in 1 blocks are still reachable in loss record 1 of 1
==2882==    at 0x4028876: malloc (vg_replace_malloc.c:236)
==2882==    by 0x42AD3B8: __gnat_malloc (in /usr/lib/i386-linux-gnu/libgnat-4.4.so.1)
==2882==    by 0x40615FF: system__task_primitives__operations__new_atcb (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x406433C: system__tasking__initialize (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x4063C86: system__tasking__initialization__init_rts (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x4063DA6: system__tasking__initialization___elabb (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x8049ADA: adainit (b~leaky_main.adb:142)
==2882==    by 0x8049B7C: main (b~leaky_main.adb:189)
==2882== 
==2882== LEAK SUMMARY:
==2882==    definitely lost: 0 bytes in 0 blocks
==2882==    indirectly lost: 0 bytes in 0 blocks
==2882==      possibly lost: 0 bytes in 0 blocks
==2882==    still reachable: 2,104 bytes in 1 blocks
==2882==         suppressed: 0 bytes in 0 blocks
==2882== 
==2882== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 6)
--2882-- 
--2882-- used_suppression:     21 U1004-ARM-_dl_relocate_object
==2882== 
==2882== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 6)

Кто-нибудь знает, почему это сообщается как ошибка? Я уверен, что нет фактической утечки, но я хотел бы знать, почему / как это происходит.

Спасибо,

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Проблемным распределением выглядит блок управления задачами (TCB).Это должно быть сохранено после завершения задачи, чтобы вы могли сказать

if Beer’Terminated then
   ...

, поэтому я думаю, что это, вероятно, артефакт, когда valgrind проверяет.

Я только пришелчерез это, где задача была распределена;необходимо было дождаться, пока ’Terminated не станет True, прежде чем освободить задачу, или GNAT с радостью освободит стек, но тихо не освободит TCB, что приведет к настоящей утечке, подобной вашей.AdaCore недавно исправил это (у меня нет ссылки, это было в журнале их разработчиков).

0 голосов
/ 06 марта 2012

Вы должны использовать deleteaker для отладки.Я предпочитаю это)

...