Head First C学習のインストールvalgrindと使用
3589 ワード
Head Frost C:302ページではValgrindツールが使用されていますが、
valgrindについて
valgrindのインストール
しかしmakeの過程で以下のエラーが発生しました
コマンドラインツールスクリプトをインストールするには、次の手順に従います.
Macは64ビットなので./configureを以下のスクリプトに変更する必要があります
valgrindの使用
デバッグコード(疑わしい人物識別専門家システム(SPIES)):
valgrindを使用してコードを実行し、余姚はデバッグ情報を追加し、
valgrindリファレンス:Mac下valgrindのインストールとUnix下Cプログラムメモリリーク検出ツールValgrindのインストールと使用
valgrindについて
valgrind
は、malloc()
を偽造することによって、スタックに割り当てられたデータを監視することができる.プログラムがスタック上のメモリを割り当てたい場合、valgrind
はmalloc()
とfree()
の呼び出しをブロックし、自分のmalloc()
とfree()
を許可し、valgrind
のmalloc()
は彼を呼び出したコードを記録し、そのメモリを割り当てます.プログラムが終了すると、valgrind
回にスタックにどのデータがあるかを報告し、これらのデータがどのコードで作成されたかを教えます.valgrindのインストール
#curl -O http://valgrind.org/downloads/valgrind-3.11.0.tar.bz2
#tar -xjvf valgrind-3.11.0.tar.bz2
cd valgrind-3.11.0
#./configure
#make
#sudo make install
しかしmakeの過程で以下のエラーが発生しました
#make[2]: *** No rule to make target `/usr/include/mach/mach_vm.defs', needed by `m_mach/mach_vmUser.c'. Stop.
#make[1]: *** [install-recursive] Error 1
#make: *** [install] Error 2
コマンドラインツールスクリプトをインストールするには、次の手順に従います.
#xcode-select --install
Macは64ビットなので./configureを以下のスクリプトに変更する必要があります
#./configure --disable-tls --enable-only64bit --build=amd64-darwin
#make
#sudo make install
valgrindの使用
デバッグコード(疑わしい人物識別専門家システム(SPIES)):
#include
#include
#include
typedef struct node{
char *question;
struct node *no;
struct node *yes;
}node;
int yes_no(char *question)
{
char answer[3];
printf("%s?(y/n):",question);
fgets(answer,3,stdin);
return answer[0] == 'y';
}
node * create(char *question)
{
node *n = malloc(sizeof(node));
n->question = strdup(question);
n->no = NULL;
n->yes= NULL;
return n;
}
void release(node *n)
{
if (n){
if(n->no)
release(n->no);
if(n->yes)
release(n->yes);
if(n->question)
free(n->question);
free(n);
}
}
int main()
{
char question[80];
char suspect[20];//
node *start_node = create("Does suspect have a mustache");
start_node->no = create("Loretta Barnsworth");
start_node->yes = create("Vinny the Spoon");
node * current;
do{
current = start_node;
while(1){
if(yes_no(current->question)){
if(current->yes){
current = current->yes;
}else{
printf("SUSPECT IDENTIFIED
");
break;
}
}else if(current->no){
current = current->no;
}else{
//
printf("Who 's the suspect?
");
fgets(suspect,20,stdin);
node *yes_node = create(suspect);
current->yes = yes_node;
//
node *no_node = create(current->question);
current->no = no_node;
//
printf("Give me a question that is True for %s but not %s? ",suspect,current->question);
fgets(question,80,stdin);
current->question = strdup(question);
break;
}
}
}while(yes_no("Run again"));
release(start_node);
return 0;
}
valgrindを使用してコードを実行し、余姚はデバッグ情報を追加し、
-g
;#gcc -g spies.c -o spies
#valgrind --leak-check=full ./spies
valgrindリファレンス:Mac下valgrindのインストールとUnix下Cプログラムメモリリーク検出ツールValgrindのインストールと使用