1

特定のmallocに対して空きが呼び出されたかどうかを、メモリリークチェッカーがどのように識別するかを理解したいと思います。mallocはbrkシステムコールで簡単に識別できるため、プロファイラーを作成していて、システムコールで中断するプロセスをシングルステップで実行すると、mallocが実行されたことを簡単に理解できます。このmallocに無料が呼び出されたかどうかを確認するにはどうすればよいですか?

以下はstraceからの出力です。このコードにはfreeがありますが、このstraceをチェックすることでfreeが呼び出されたかどうかをどのように判断できますか?

read(0, "13608\n", 4096)                = 6
brk(0)                                  = 0x8cc6000
brk(0x8ce7000)                          = 0x8ce7000
write(1, "File name - /proc/13608/maps\n", 29) = 29
open("/proc/13608/maps", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x55559000
read(3, "00349000-00363000 r-xp 00000000 "..., 4096) = 1046
write(1, "ptr1-ffd1f49a\n", 14)         = 14
write(1, "ptr2-ffd1f4a8\n", 14)         = 14
write(1, "Buffer read - 00349000-00363000 "..., 102) = 102
write(1, "\n", 1)                       = 1
write(1, "ptr1-ffd1f49a\n", 14)         = 14
write(1, "ptr2-ffd1f4aa\n", 14)         = 14
write(1, "Buffer read - 00367000-004a6000 "..., 104) = 104
write(1, "\n", 1)                       = 1
write(1, "ptr1-ffd1f49a\n", 14)         = 14
write(1, "ptr2-ffd1f4bd\n", 14)         = 14
write(1, "Buffer read - 08048000-08049000 "..., 123) = 123
write(1, "\n", 1)                       = 1
write(1, "ptr1-ffd1f49a\n", 14)         = 14
write(1, "ptr2-ffd1f4a1\n", 14)         = 14
write(1, "Buffer read - ffad8000-ffaf1000 "..., 95) = 95
write(1, "\n", 1)                       = 1
write(1, "ptr1-ffd1f479\n", 14)         = 14
write(1, "ptr2-ffd1f479\n", 14)         = 14
write(1, "Buffer read - ffffe000-fffff000 "..., 55) = 55
write(1, "\n", 1)                       = 1
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x55559000, 4096)                = 0
write(1, "Starting Address - 00349000\n", 28) = 28
write(1, "Ending Address - 00363000\n", 26) = 26
write(1, "Permissions - r-xp\n", 19)    = 19
write(1, "Offset - 00000000\n", 18)     = 18
write(1, "PathName - </lib/ld-2.5.so>\n", 28) = 28
write(1, "\n", 1)                       = 1
write(1, "\n", 1)                       = 1
write(1, "Starting Address - 00367000\n", 28) = 28
write(1, "Ending Address - 004a6000\n", 26) = 26
write(1, "Permissions - r-xp\n", 19)    = 19
write(1, "Offset - 00000000\n", 18)     = 18
write(1, "PathName - </lib/libc-2.5.so>\n", 30) = 30
write(1, "\n", 1)                       = 1
write(1, "\n", 1)                       = 1
write(1, "Starting Address - 08048000\n", 28) = 28
write(1, "Ending Address - 08049000\n", 26) = 26
write(1, "Permissions - r-xp\n", 19)    = 19
write(1, "Offset - 00000000\n", 18)     = 18
write(1, "PathName - </fs_user/samirba/myP"..., 49) = 49
write(1, "\n", 1)                       = 1
write(1, "\n", 1)                       = 1
write(1, "Starting Address - ffad8000\n", 28) = 28
write(1, "Ending Address - ffaf1000\n", 26) = 26
write(1, "Permissions - rw-p\n", 19)    = 19
write(1, "Offset - 7ffffffe6000\n", 22) = 22
write(1, "PathName - <[stack]>\n", 21)  = 21
write(1, "\n", 1)                       = 1
write(1, "\n", 1)                       = 1
write(1, "Starting Address - ffffe000\n", 28) = 28
write(1, "Ending Address - fffff000\n", 26) = 26
write(1, "Permissions - r-xp\n", 19)    = 19
write(1, "Offset - ffffe000\n", 18)     = 18
write(1, "PathName - <EMPTY>\n", 19)    = 19
write(1, "\n", 1)                       = 1
write(1, "\n", 1)                       = 1
exit_group(0)                           = ?
4

2 に答える 2

1

malloc 呼び出しとシステム コールの間には、1 対 1 の関係はありません。通常、malloc ライブラリは、brk システム コールや mmap システム コールなどを使用して OS から大きなブロックを取得します。次に、これらの大きなブロックは小さなブロックに分割され、連続する malloc 呼び出しに対応します。通常、free によってシステム コール (例: munmap) が呼び出されることはありません。そのため、システム コール レベルで malloc と free を実際に追跡することはできません。

Valgrind は、malloc、free などをインターセプト (および置換) するため、メモリ リークを追跡できます。Valgrind 置換関数は、割り当てられたブロックのリストを維持しています。

実際のリーク (つまり、もう到達できないメモリ、つまり、そのメモリへのすべてのポインタが失われた/消去された) は、すべてのアクティブなメモリのスキャンを使用して Valgrind によって検出されます。

于 2012-07-20T23:29:39.953 に答える
0

AFAIK、OSによって割り当てられたメモリブロックは、開始アドレスによって識別されます。free()したがって、以前に返された同じ引数で呼び出されるものを探しますmalloc()straceより低レベルmmapの呼び出しをログに記録するときbrkは、を使用ltraceして高レベルのライブラリ呼び出しをログに記録し、戻り値と引数に注意してください。

于 2012-07-19T23:24:43.433 に答える