2016-10-05 3 views
0

私はこのように、1つの自己定義のmalloc()でバックトレース()関数を使用します。backtrace()は無限回帰に入りますか?

void *malloc(size_t size) 
    {printf("my malloc!\n"); 
      //map_insert 

     static void *(*mallocp)(size_t size); 
     char *error; 
     void *ptr; 
     void *buffer[100]; 
     int nptrs; 
     char ptrs_num[10]; 
     memset(ptrs_num, '\0', 10); 
     char **strings; 
     printf("1\n"); 
     nptrs = backtrace(buffer, 100); 
/* those code below seems useless because problem happens here*/ 
     printf("2\n"); 
     printf("backtrace() returned %d addresses\n", nptrs); 
     printf("3\n"); 
     strings = backtrace_symbols(buffer, nptrs); 
     printf("4\n"); 
     if (strings == NULL) { 
      perror("backtrace_symbols"); 
      exit(1); 
     } 
     /*code neglected*/ 
     return ptr; 
    } 

これは、コードの一部は、私の.soファイル内にある、と私はこれを実行していないので、いくつかのバグが存在する可能性があります変更します。私はこのテストコードを使用します。

#include <stdlib.h> 
#include <malloc.h> 
#include <stdio.h> 
int main(int argc, char **argv){ 

    printf("to malloc a!\n"); 
    char *a=(char *)malloc(sizeof(int)*1024); 
    return 0; 
} 

私の結果は以下の通りです:

my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
my malloc! 
1 
Segmentation fault 

これは、なぜ私は本当に知りません。

バックトレースはちょうど私のmallocをトリガーする理由をいくつかの情報を得るだろうと思いますか?

+1

を 'backtrace'も' malloc'呼び出しますので、あなたは無限再帰を持っているようです。 'printf(" malloc a!\ n ");)の出力もそこにありますか? – mch

+0

デバッガを使用してコードをステップ実行しようとしましたか? –

+0

理由を教えてください:< –

答えて

2

backtrace()malloc()となります。あなたのフックmalloc関数への再帰呼び出しがあります。これは既知の問題です。 malloc()でbacktrace()を使用するには、フックされた関数内から呼び出されたことを示すフラグを設定し、そうであれば、malloc()以外の別の機構を使用して要求されたメモリを割り当てて返しますmmap()brk()など

を使用しても参照してください:https://sourceware.org/ml/libc-alpha/2015-02/msg00653.html

関連する問題