2012-04-11 6 views
0

私はC++でMIPSパイプラインシミュレータ用のコードを書いています。私の関数の1つがフェッチされます。いくつかのデバッグの後、セグメンテーションフォルトが発生するフェッチ関数に絞り込んだ。誰かがなぜそれが起こるか把握するのを助けることができますか?以下のコードはここにある:すべてのアレイのなぜ私はこのセグメンテーションフォールトを得ているのか理解する助けが必要です

void Simulator::fetch(){ 
int flag =0; 
string buf, rd; 
int i; 
for(i = 0;i<4;i++){ 
if(pre_issue_buffer[i]==";"){ 
    flag = 1; 
    break; 
} 
} 
if(flag ==1){ 
if(i<3){ 
string instr = memory.read_memory(PC); 
stringstream ss(instr); 
vector<string> tokens; 
while (ss >> buf) 
    tokens.push_back(buf); 
string instruction = tokens.at(0); 
if(instruction == "BREAK"){ 
     brk =1; 
     instr_string=instruction; 
} 
else if(instruction=="NOP"){ 

    instr_string=instruction; 
} 
else if(instruction=="J"){ 
    int address=toInt(tokens.at(1)); 
    if(address>this->break_addr){ 
     cerr<<"Invalid Jump Address at: "<<PC<<endl; 
    } 
    PC = address; 
    exec_instr=instruction+"\t#"+tokens.at(1); 
} 
else if(instruction=="JR"){ 
    rd = tokens.at(1); 
    if(regInUse[rd]==0){ 
    p=regFile.find(tokens.at(1)); 
    PC = p->second; 
    exec_instr=instruction+"\t"+tokens.at(1); 
} 
    else 
     waiting_instr= instruction+"\t"+tokens.at(1); 
} 
else if(instruction=="BEQ"){ 
    int rs,rt; 
    rd = tokens.at(1); 
    if(regInUse[rd]==0){ 
    p=regFile.find(tokens.at(1)); 
    rs = p->second; 
    p=regFile.find(tokens.at(2)); 
    rt = p->second; 
    if(rs==rt){ 
     int offset=toInt(tokens.at(3)); 
     PC = PC+offset+4; 
    } 
    else 
     PC=PC+4; 
    exec_instr=instruction+"\t"+tokens.at(1)+", "+tokens.at(2)+", #"+tokens.at(3); 
} 
    else 
    waiting_instr=instruction+"\t"+tokens.at(1)+", "+tokens.at(2)+", #"+tokens.at(3); 
} 
else if(instruction=="BLTZ"){ 
    rd = tokens.at(1); 
    if(regInUse[rd]==0){ 
    p = regFile.find(tokens.at(1)); 
    int rs = p->second; 
    if(rs<0){ 
     int offset=toInt(tokens.at(2)); 
     PC = PC + offset+4; 
    } 
    else 
     PC=PC+4; 
    exec_instr=instruction+"\t"+tokens.at(1)+", #"+tokens.at(2); 
} 
    else 
     waiting_instr=instruction+"\t"+tokens.at(1)+", #"+tokens.at(2); 
} 
else if(instruction=="BGTZ"){ 
    rd = tokens.at(1); 
    if(regInUse[rd]==0){ 
    p = regFile.find(tokens.at(1)); 
    int rs = p->second; 
    if(rs>0){ 
     int offset=toInt(tokens.at(2)); 
     PC = PC + offset+4; 
    } 
    else 
     PC=PC+4; 
    exec_instr=instruction+"\t"+tokens.at(1)+", #"+tokens.at(2); 
} 
    else 
    waiting_instr=instruction+"\t"+tokens.at(1)+", #"+tokens.at(2); 
} 
else{ 
rd = tokens.at(1); 
pre_issue_buffer[i]=instr; 
cout<<i<<endl; 
PC=PC+4; 
} 

}

+0

デバッグ用にコンパイルしましたか?あなたはコアダンプを取得しますか?デバッガ(gdbなど)を使用して、エラーに近いボットを取得しようとする可能性があります。 – gbulmer

+0

gdbを使ってエラーに近づけるにはどうすればいいですか?gdbをあまり使わなかったのですが、バックトレースを使ってこの関数のエラーを見つけましたが、それをどのように超えていますか? – Chaos

答えて

1

チェック、あなたがアクセスし、それが配列の範囲内だ検証しようとしているポジション。

回答に必要な情報がありません。私が言うことができるのは、あなたの機能の始めと終わりのことです。

+0

大丈夫、ここで使用している唯一の配列は、最大4つの要素を含むことができるpre_issue_bufferです。 regInUseとMemoryはマップオブジェクトで、前にそれらをテストしたので、エラーを作成する必要はありません – Chaos

関連する問題