2012-03-03 1 views
2

У меня есть следующая маленькая программа Ada:Ada Задача Декларация Причины утечек памяти

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) 

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

Спасибо,

+0

где есть ошибка? 0 ошибок, 0 байт потеряно ... – oenone

+0

@oenone: «все еще достижимо: 2,104 байта в 1 блоке» – NWS

+0

где проблема? память по-прежнему доступна. это не ошибка и не сообщается как таковой. – oenone

ответ

2

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

if Beer’Terminated then 
    ... 

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

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

+0

Спасибо, Саймон, Это похоже на правдоподобное объяснение. Я напишу подавление для valgrind, чтобы справиться с этим :) – NWS

+0

Интересно. Спасибо Вам за информацию. – Shark8

0

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

+0

отличный инструмент для отладки. –

+0

Не имеет значения для разработки Ada. –