2010-12-27 11 views
0

私はBSPlibを使用しています。複数のスレッドで実行されている関数に "int i"という単純な定義を追加すると、 "Process 2 catch SIGNAL 11 Segmantation fault"のようなメッセージが表示されます。私がたくさんチェックしたことに注意することは重要です。セグメンテーションエラーがなければ、セグメンテーションフォルトは得られません。 どうすればint定義できますか?私はスタックオーバーフローが発生している可能性がありますか?ありがとう。 semmingly無害な変更が問題になるか、修正例大半でこれまでにない最も奇妙なバグ - int定義はsigsegvを引き起こします。スタックオーバーフロー?

int P; 
int main(int argc, char* argv[]) 
{ 
    /** sequentail - process 0 */ 
    P=bsp_nprocs(); /// maximum number of process avialble (must do that on sequential part ,need for bsp begin) 
    bsp_begin(P); 
    char* str1; 
    char* str2; 
    int n; 
    int** table; 
    int thread=bsp_pid(); 
    int num_threads=bsp_nprocs(); 
    if(thread == 0) 
    { 
     ifstream file1(argv[1]); 
     ifstream file2(argv[2]); 
     // check if the strings are the same size RDBG 
     string string1((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>()); 
     string string2((istreambuf_iterator<char>(file2)), istreambuf_iterator<char>()); 
     n=string1.length(); 
     str1= (char*)malloc(sizeof(char)*(n+1)); 
     str2= (char*)malloc(sizeof(char)*(n+1)); 
     strcpy(str1,string1.c_str()); 
     strcpy(str2,string2.c_str()); 
    } 
    if (thread!=0) 
    { 
     str1= (char*)malloc(sizeof(char)*(n+1)); 
     str2= (char*)malloc(sizeof(char)*(n+1)); 
    } 
    bsp_push_reg(&n,SZINT); 
    bsp_sync(); 
    bsp_get(0,&n,0,&n,SZINT); 
    bsp_sync(); 
    if (thread==0) 
    { 
     table=(int**)malloc(sizeof(int)*(n+1)); 
     for (int i=0; i<n+1; i++) 
      table[i]=(int*)malloc(sizeof(int)*(n+1)); 
    } 
    bsp_push_reg(str1,SZCHAR*(n+1)); 
    bsp_push_reg(str2,SZCHAR*(n+1)); 
    bsp_push_reg(table,n*n*SZINT); 
    bsp_sync(); 
    if (thread==0) 
    { 
     for(int t=1; t<num_threads; t++) 
      for (int k=0; k<=n; k++) 
      { 
       bsp_put(t,str1+k,str1,k*SZCHAR,SZCHAR); 
       bsp_put(t,str2+k,str2,k*SZCHAR,SZCHAR); 
      } 
    } 
    bsp_sync(); 
    cout << thread << "!!!" << str1 << ";" << str2 << endl; 
    int i; 
    bsp_sync(); 
    bsp_pop_reg(table); 
    bsp_pop_reg(str2); 
    bsp_pop_reg(str1); 
    bsp_pop_reg(&n); 
    bsp_sync(); 
    free(str1); 
    free(str2); 
    bsp_sync(); 
    bsp_end(); 
    return 0; 
} 
+5

ご覧になるには、いくつかのコードサンプルをご紹介ください。 –

+4

これはおそらく今までにない最も奇妙なバグではありません。 –

+2

私はint定義があなたの問題の原因だとは思わない、それはちょうどあなたのコードのどこかにエラーがあることを示しています。この定義は、メモリおよびf.e。内の他の変数を移動させる。誤って "variable_i_just_need_once"を変更したポインタバグが "dont_change_this_i_need_it_everywhere"に変更されるようになりました。 – schnaader

答えて

2

テーブル変数の宣言/初期化が正しくありません。これを配列の配列(つまりn + 1個の別個のメモリブロック)として初期化しますが、bsplibはn * n個のintの連続したメモリブロックであることを伝えています。あなたは割り当てや登録を変更する必要があります。

したがって、bsplibは、初期化されていないメモリをまったく上書きします。

1

、あなたは特異なバグとして知られているものがあります。その場合、それは根本的な原因である実際の変更ではなく、変更は真のバグを引き起こす触媒に過ぎません。

BSPlibがどのようにスレッドを実行するかは完全にはわかりませんが、threadが0でない場合、nの値が初期化されていないように見えます。すなわち

は、値のみthread == 0ためstring1の長さに設定されている、まだそれがthread !=0ためmalloc空間に使用され、ゴミがスタック上にあるように起こった何に依存する空間という。

0
string string1((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>()); 
    string string2((istreambuf_iterator<char>(file2)), istreambuf_iterator<char>()); 
    n=string1.length(); 
    str1= (char*)malloc(sizeof(char)*(n+1)); 
    str2= (char*)malloc(sizeof(char)*(n+1)); 
    strcpy(str1,string1.c_str()); 
    strcpy(str2,string2.c_str()); 

string2がstring1よりも長いとどうなりますか?これは今の場合ですか? string1のサイズをに割り当てるには、mallocを使用しています。 string2string1よりも長い場合は、バッファオーバーフローが発生し、メモリ内のすべての種類のものが破損する可能性があります。

n1 = string1.length(); n2 = string2.length();する必要がありますか?

+0

プログラムは等しい文字列に対してのみ設計されています – tomermes

関連する問題