2012-03-03 6 views
2

原因私は、次の少しAdaのプログラムを持っているエイダタスク宣言は、メモリリーク

gnatmake -g -gnatwI leaky_main.adb 

と、このようValgrindはを通してそれを実行します。

01:

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

@enone: "まだ到達可能:1ブロックで2,104バイト" – NWS

+0

どこが問題ですか?メモリはまだ到達可能です。それはエラーではなく、そのように報告されていません。 – oenone

答えて

2

は、問題の割り当ては、タスク制御ブロック(TCB)になりそうです。これはので、私はそれはおそらくvalgrindがthecheckしたときの加工品だと思いますが

if Beer’Terminated then 
    ... 

を言うことができるように、タスクが完了した後も保持する必要があります。

私はタスクが割り当てられた場所にしか出会っていません。タスクを割り当て解除する前に’TerminatedTrueになるまで待つ必要がありました。そうでなかった場合、GNATはスタックを解放しましたが、自動的にTCBの割り当てを解除しませんでした。 AdaCoreは最近これを修正しました(私は参照を持っていません、彼らの開発者のログにあった)。

+0

ありがとうサイモン、これはもっともらしい説明のようです。病気に対処するvalgrindの抑制を書く:) – NWS

+0

面白い。情報ありがとうございます。 – Shark8

0

デバッガを使用してデバッグする必要があります。私はそれを好む)

+0

デバッグ用の優れたツールです。 –

+0

Ada開発には関係ありません。 –