11.2. memstomp の使用
分析するプログラムで memstomp
ユーティリティーを実行するには、以下を実行します。
$ scl enable devtoolset-12 'memstomp program argument...'
問題が検出されたときに、解析されたプログラムをすぐに終了するには、--kill
(または -k
) コマンドラインオプションを指定してユーティリティーを実行します。
$ scl enable devtoolset-12 'memstomp --kill program argument...'
マルチスレッドプログラムを分析する場合は、--kill
オプションの使用が特に推奨されます。バックトレースの内部実装はスレッドセーフではなく、このオプションなしでマルチスレッドプログラムで memstomp
ユーティリティーを実行すると信頼できない結果が発生する可能性があります。
さらに、解析しているプログラムをデバッグ情報でコンパイルした場合や、このデバッグ情報が利用できる場合は、--debug-info
(または -d
) コマンドラインオプションを使用して、より詳細なバックトレースを作成できます。
$ scl enable devtoolset-12 'memstomp --debug-info program argument...'
バイナリーファイルにビルドされたデバッグ情報を使用してプログラムをコンパイルする方法は、「デバッグプログラムの準備」 を参照してください。Red Hat Developer Toolset パッケージのデバッグ情報をインストールする方法は、「デバッグ情報のインストール」 を参照してください。
この scl
ユーティリティーを使用してコマンドを実行すると、これを Red Hat Enterprise Linux システムに優先して使用する Red Hat Developer Toolset バイナリーで実行することができることに注意してください。これにより、Red Hat Developer Toolset memstomp
をデフォルトとして設定して、シェルセッションを実行することができます。
$ scl enable devtoolset-12 'bash'
例11.1 memstomp の使用
現在の作業ディレクトリーに、以下の内容を含む employee.c
という名前のソースファイルを作成します。
#include <stdio.h> #include <string.h> #define BUFSIZE 80 int main(int argc, char *argv[]) { char employee[BUFSIZE] = "John,Doe,john@example.com"; char name[BUFSIZE] = {0}; char surname[BUFSIZE] = {0}; char *email; size_t length; /* Extract the information: */ memccpy(name, employee, ',', BUFSIZE); length = strlen(name); memccpy(surname, employee + length, ',', BUFSIZE); length += strlen(surname); email = employee + length; /* Compose the new entry: */ strcat(employee, surname); strcpy(employee, name); strcat(employee, email); /* Print the result: */ puts(employee); return 0; }
このプログラムを、employee
という名前のバイナリーファイルにコンパイルします。
$ scl enable devtoolset-12 'gcc -rdynamic -g -o employee employee.c'
メモリー領域が重複する誤った関数呼び出しを特定するには、以下を実行します。
$ scl enable devtoolset-12 'memstomp --debug-info ./employee'
memstomp: 0.1.4 successfully initialized for process employee (pid 14887).
strcat(dest=0x7fff13afc265, src=0x7fff13afc269, bytes=21) overlap for employee(14887)
??:0 strcpy()
??:0 strcpy()
??:0 _Exit()
??:0 strcat()
employee.c:26 main()
??:0 __libc_start_main()
??:0 _start()
John,john@example.comDoe,