4

C でメモリの問題をデバッグしています。アクセスしているメモリの一部が、free()他の誰かのモジュールによって誤って :d されました。gdbメモリの一部がfree():dになったときに通知を受け取る方法はありますか?

4

2 に答える 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

メモリ リークに関する情報を取得するには、次のツールが非常に役立ちます。

  1. ヴァルグラインド

  2. Google パフォーマンス ツール

そして、これらの操作に慣れるのにそれほど時間はかかりません。試してみる価値は間違いありません。

または、ハードウェアウォッチポイントを使用して特定のアドレスを追跡すると役立つ場合があります-監視しているアドレスへの読み取りまたは書き込みが発生するたびにデバッガーが制御を取得します-しかし、これが問題の正確な解決策を提供するかどうかはわかりません.

于 2012-10-06T07:03:43.483 に答える