C でメモリの問題をデバッグしています。アクセスしているメモリの一部が、free()
他の誰かのモジュールによって誤って :d されました。gdb
メモリの一部がfree()
:dになったときに通知を受け取る方法はありますか?
3013 次
2 に答える
9
libc のfree
引数が と呼ばれているとしmem
ます。
次に、解放されたすべてを印刷できます。
(gdb) break __GI___libc_free # this is what my libc's free is actually called
Breakpoint 2 at 0x7ffff7af38e0: file malloc.c, line 3698.
(gdb) commands 2
Type commands for when breakpoint 2 is hit, one per line.
End with a line saying just "end".
>print mem
>c
>end
これで、誰かが何かを解放するたびに、小さな出力が得られます (発生c
するたびに停止したい場合は省略できますfree
)。
Breakpoint 2, *__GI___libc_free (mem=0x601010) at malloc.c:3698
3698 malloc.c: No such file or directory.
in malloc.c
$1 = (void *) 0x601010
または、関心のあるメモリアドレスが既にわかっている場合は、誰かがそのアドレスcond
にアクセスしようとしたときにブレークするために使用します。free
(gdb) cond 2 (mem==0x601010)
(gdb) c
Breakpoint 3, *__GI___libc_free (mem=0x601010) at malloc.c:3698
3698 malloc.c: No such file or directory.
in malloc.c
(gdb)
于 2012-10-06T07:20:42.340 に答える
2
メモリ リークに関する情報を取得するには、次のツールが非常に役立ちます。
そして、これらの操作に慣れるのにそれほど時間はかかりません。試してみる価値は間違いありません。
または、ハードウェアウォッチポイントを使用して特定のアドレスを追跡すると役立つ場合があります-監視しているアドレスへの読み取りまたは書き込みが発生するたびにデバッガーが制御を取得します-しかし、これが問題の正確な解決策を提供するかどうかはわかりません.
于 2012-10-06T07:03:43.483 に答える