2012-04-11 78 views
0

我正在写一个MIPS管道模拟器在C++中的代码。我的一个功能是抓取。经过一些调试后,我缩小了我的抓取功能,发生分段错误。有人能帮我弄清楚为什么会发生?该代码是在这里如下:需要帮助找出为什么我得到这个分段错误

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 2012-04-11 18:37:52

+0

我如何使用gdb来接近错误,我没有使用gdb太多,我用backtrace来发现错误在这个函数中,但我该怎么做呢? – Chaos 2012-04-11 18:39:03

回答

1

检查,对于每一个阵列,您试图访问和验证它的数组边界内的位置。

我们没有足够的信息来回答。对于我可以告诉它可能是在你的函数的开始和结束。

+0

没关系,我在这里使用的唯一数组是pre_issue_buffer,它可以包含最多4个元素。 regInUse和Memory是地图对象,我之前测试过它们,所以我不认为它们应该创建错误 – Chaos 2012-04-11 18:41:32

相关问题