1

pin を使用して簡単なプログラムを分析します。

4 つの malloc 関数がありますが、malloctrace という pintool で pin を使用すると、4 つ以上の malloc が表示されます。

これらの malloc 関数は何ですか?

私のOSはUbuntu 12.04 64bitです。以下の項目は、私が作成したコードと pintool の結果です。

#include <stdio.h>
#define SIZE 100

int main()
{
    int *test1 = (int*)malloc(SIZE* sizeof(int));
    int *test2 = (int*)malloc(SIZE* sizeof(int));
    int i, j;
    int *test3 = (int*)malloc(16*sizeof(int));
    int *test4 = (char*)malloc(SIZE* sizeof(int));

    test1[0] = 2;
    test1[2] = 3;
    test2[0] = 5;

    printf("test1's addr : %p , test1's val = %d    \n", test1, test1[0]);
    printf("test1's addr : %p , test1's val = %d    \n", &test1[1], test1[1]);
    printf("test2's addr : %p , test2's val = %d    \n", &test1[9], test1[9]);


    return 0;
}

       name           size          start_addr           malloc_IP          access_cnt
     malloc          0x589                   0      0x7ffff7de557e                   0
     malloc          0x489                   0      0x7ffff7de557e                   0
     malloc            0xf                   0      0x7ffff7ddd29e                   0
     malloc           0x4b                   0      0x7ffff7df01b2                   0
     malloc           0x28                   0      0x7ffff7de1fe7                   0
     malloc         0x14a0                   0      0x7ffff7de202c                   0
     malloc           0x28                   0      0x7ffff7de22ad                   0
     malloc           0x48                   0      0x7ffff7ddf9d3                   0
     malloc           0x5c                   0      0x7ffff7ddf9d3                   0
     malloc           0x5c                   0      0x7ffff7ddf9d3                   0
     malloc           0x39                   0      0x7ffff7ddf9d3                   0
     malloc           0x20                   0      0x7ffff7de294e                   0
     malloc          0x492                   0      0x7ffff7de557e                   0
     malloc           0x20                   0      0x7ffff7de57ed                   0
     malloc           0x28                   0      0x7ffff7de776f                   0
     malloc           0x38                   0      0x7ffff7de7900                   0
     malloc           0x48                   0      0x7ffff7deab5a                   0
     malloc           0x48                   0      0x7ffff7deab5a                   0
     malloc          0x228                   0      0x7ffff7deab5a                   0
     malloc           0x90                   0      0x7ffff7deab5a                   0
     malloc          0x410                   0      0x7ffff7ddaf22                   0
     malloc          0x110                   0      0x7ffff7debd52                   0
     malloc          0x190                   0            0x4013d2                   0
     malloc          0x190            0x603010            0x4013d2                   0
     malloc          0x190            0x6031b0            0x4013e0                   0
     malloc           0x40            0x603350            0x4013ee                   0
     malloc          0x190            0x6033a0            0x4013fc                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x401688                   0
       free              0                   0            0x4016b0                   0
       free              0                   0            0x4016b0                   0
       free              0                   0            0x4016d7                   0
       free              0                   0            0x4016d7                   0
       free              0                   0            0x4016d7                   0
       free              0                   0            0x4016d7                   0
       free              1                   0            0x4016e8                   0
       free              0                   0            0x4016e8                   0
       free              0                   0            0x401718                   0
       free              0                   0            0x401718                   0
4

3 に答える 3

1

あなたにとって重要なmalloc呼び出しはこれです

 malloc          0x190            0x603010            0x4013d2                   0
 malloc          0x190            0x6031b0            0x4013e0                   0
 malloc           0x40            0x603350            0x4013ee                   0
 malloc          0x190            0x6033a0            0x4013fc    

残りは、いくつかのシステム コールによって内部的に呼び出されています。

于 2013-11-28T14:40:56.077 に答える
1

mallocC ランタイム コード (例として、 などで使用されるスレッド固有のデータstrtok) や分析ツール自体など、他のものが内部で呼び出されている可能性は十分にあります。

これらすべてのメモリブロックの開始アドレスを調べると、実行するものを除くすべてが同じであることがわかります0(100 個の 4 バイトint変数が op400または0x190バイトを使用し、そのうち 16 個が up64または0x40バイトを使用します)。

それはここに関連しているかもしれませんが、自分の後片付けをしていないのはあなただけかもしれません:-)


ところで、C で の戻り値をキャストしないでください。これは、と ポインタのサイズが異なる幅で、 を含めるのを忘れたmalloc場合など、特定の微妙なエラーを隠すことができるためです。 64 ビット環境で実行されています。intstdlib.h

C は、void *返された frommallocを他の任意のポインター型に暗黙的にキャストすることが完全に可能です。

于 2013-11-27T07:34:23.763 に答える