Head First C学習のインストールvalgrindと使用

3589 ワード

Head Frost C:302ページではValgrindツールが使用されていますが、
valgrindについてvalgrindは、malloc()を偽造することによって、スタックに割り当てられたデータを監視することができる.プログラムがスタック上のメモリを割り当てたい場合、valgrindmalloc()free()の呼び出しをブロックし、自分のmalloc()free()を許可し、valgrindmalloc()は彼を呼び出したコードを記録し、そのメモリを割り当てます.プログラムが終了すると、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のインストールと使用