Akio's Log

ソフトウェア開発、プロジェクトマネジメント、プログラミング、ランニングなどなど

mtraceを使ってみる

メモリリークが発生しているっぽいので、gccで使えるmtraceというメモリリーク検出ツールを試してみた。

mtraceはこんなツールです。
1) malloc,freeなどのメモリ管理関数から、メモリリークを追跡
してくれるツール
2) GNU mallocライブラリ付属関数なので、新たなパッケージ
をインストールしたりコンパイルする手間がはぶけるので便利

ふむふむ。とりあえず、やりたい事は実現できそうなので試してみる。

以下、この手順で実施。

gccの場合、mtraceというツールが使える。
使用手順は
1.環境変数MALLOC_TRACE=[ログファイル名]を設定
2.プログラム改造:関数 mtrace()、 muntrace() を挿入。(この間のmalloc, freeがカウントされる)
3.コンパイル: -g オプションをつける。(gcc -g hoge.c)
4.ログ解析:mtrace [プログラム名] [ログファイル名]

1〜3まで完了。生成された実行ファイルを実行させてみると、ちゃんとファイルが出力された。

1 = Start
2 @ /lib/libc.so.6:[0xcb5faf] + 0x805f378 0x160
3 @ /lib/libc.so.6:(__strdup+0x30)[0xcccb80] + 0x805f4e0 0xf
4 @ /lib/libc.so.6:[0xcb5faf] + 0x805f4f8 0x160
5 @ /lib/libc.so.6:[0xce14f2] + 0x805f660 0x54
6 @ /lib/libc.so.6:(fclose+0x136)[0xcb5676] - 0x805f4f8
7 @ /lib/libc.so.6:[0xce0181] + 0x805f4f8 0xc
8 @ /lib/libc.so.6:[0xce0181] + 0x805f508 0xc
9 @ /lib/libc.so.6:[0xce0181] + 0x805f518 0xc
10 @ /usr/lib/libstdc++.so.6:(_Znwj+0x27)[0x3332b27] + 0x805f6b8 0x190
11 @ /usr/lib/libstdc++.so.6:(_Znwj+0x27)[0x3332b27] + 0x805f850 0x4b0
12 @ /usr/lib/libstdc++.so.6:(_Znwj+0x27)[0x3332b27] + 0x805f528 0x1

で、「4」。コマンドライン上でmtraceを実行させて、ログファイルを解析しようとしたところ、mtraceコマンドがない。

GNU mallocライブラリ付属関数なので、新たなパッケージをインストールしたりコンパイルする手間がはぶけるので便利

ってな記述があるから、パッケージの追加は必要ないのかと思っていたけど、調べてみるとmtraceコマンドは「glibc-utils」パッケージに含まれているそうで、現在の環境にはインストールされていなかった事が判明。なので早速yumでinstall

# yum install glibc-utils
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
glibc-utils i386 2.5-24 base 126 k
Updating for dependencies:
glibc i686 2.5-24 base 5.2 M
glibc-common i386 2.5-24 base 16 M
glibc-devel i386 2.5-24 base 2.0 M
glibc-headers i386 2.5-24 base 610 k

Transaction Summary
=============================================================================
Install 1 Package(s)
Update 4 Package(s)
Remove 0 Package(s)

他のパッケージも依存しているようなので、一緒に更新。

これで無事、mtraceコマンドを使用する事が出来た。


これでメモリリークを検出できるかどうか、バグが修復できるかどうかは、また別な話。がんばるぞ。

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

Debug Hacks -デバッグを極めるテクニック&ツール

Debug Hacks -デバッグを極めるテクニック&ツール

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング