Memory leaks Ada任务声明导致内存泄漏

Memory leaks Ada任务声明导致内存泄漏,memory-leaks,valgrind,ada,Memory Leaks,Valgrind,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 --le

我有以下的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)
有人知道为什么这会被报告为错误吗? 我相当确定没有实际泄漏,但我想知道为什么/如何发生


谢谢,

有问题的分配看起来是任务控制块(TCB)。这必须在任务完成后保留,以便您可以说

if Beer’Terminated then
   ...
因此,我认为这可能是
valgrind
进行检查的人工制品


我只在分配任务的地方遇到过这个问题;在解除分配任务之前,必须等待
终止
,或者GNAT愉快地解除了堆栈的分配,但没有悄悄地解除TCB的分配,从而导致像您这样的真正泄漏。AdaCore最近修复了这个问题(我没有参考资料,它在他们的开发人员日志上)。

您应该使用Delaker进行调试。(我更喜欢)

谢谢西蒙,这看起来是一个合理的解释。我会写一封信给valgrind来处理:)有趣。谢谢你提供的信息。哪里有错误?0个错误,0个字节丢失…@oenone:“仍然可以访问:1个块中有2104个字节”问题出在哪里?内存仍然可以访问。这不是错误,也没有这样的报告。当程序终止后可以访问内存时,这是一个泄漏,这是一个问题。正如Simon指出的,这可能是由于一个已知的错误。我认为这不是一个问题。这可能并不理想,但操作系统释放了进程所使用的任何内存。与Ada开发无关。