2015-04-01 62 views
-2

所以我的代码编译得很好,但每当我尝试运行程序时,它都会出现seg错误。我跑它通过GDB并得到了这组错误的:Seg Fault - 接收到信号,SIGABORT

terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_S_construct null not valid 

Program received signal SIGABRT, Aborted. 
0x00007ffff722bcc9 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 

这里是我的代码,如果有帮助:

using namespace std; 
#include <iostream> 
#include <vector> 
#include <cmath> 
#include<fstream> 
#include <cstdlib> 
#include <utility> 
#include <string> 

class Page 
{ 
    public: 
    int TimeStamp; 
    int ProgramOwner; 
    int LocalPageNumber; 

}; 

//Pair: first entry is local page, second entry is global page 
//Second entry: 1 if in main memory, 0 if not 
class Program 
{ 
    public: 
    vector< pair<int,int> > MemoryMap; 
}; 

class Memory 
{ 
    public: 
    vector<Program> Programs; 
    vector<Page> Pages; 
}; 

void checkArguments(int argc, char *argv[]); 
bool checkPageAlgorithm(char *argv[]); 
bool checkPageSize(int pagesize); 
bool checkPageStyle(char *argv[]); 
bool checkPTrace(string ProgramTraceFile); 
bool checkPList(string ProgramListFile); 

int main(int argc, char *argv[]) 
{ 
    //checkArguments(argc, argv); 

    const int MemSize = 512; 
    int pageSize = atoi(argv[3]); 
    string programListFile = argv[1]; 
    string ProgramTraceFile = argv[2]; 
    string pageAlgorithm = argv[4]; 
    string pageStyle = argv[5]; 
    int programNumber; 
    int programSize; 
    int PagesNeeded; 
    Memory MainMemory; 
    int numberFrames; 
    int pageFaults = 0; 
    int numPrograms = 0; 
    int PagesPerProgram; 
    int LocalPage; 
    int activeProgram; 
    int requestedLocation; 
    int newPageLocation; 
    bool foundInMemory; 

    ifstream fileIn; 
    fileIn.open(programListFile.c_str()); 
    if(fileIn.fail()) 
    { 
    cerr << "List file not found." << endl; 
    fileIn.close(); 
    exit(1); 
    } 
    else 
    { 
    while(!fileIn.eof()) 
    { 
     cout << "hey0"; 
     fileIn >> programNumber; 
     fileIn >> programSize; 
     numPrograms++; 
    } 
    } 

    numberFrames = ceil(MemSize/pageSize); 
    PagesPerProgram = ceil(numberFrames/numPrograms); 
    MainMemory.Pages.resize(numberFrames); 

    cout << "hey1"; 
    while(!fileIn.eof()) 
    { 
    cout << "hey2"; 
    fileIn >> programNumber; 
    fileIn >> programSize; 
    cout << "hey3"; 
    PagesNeeded = ceil(programSize/pageSize); 
    for(int i = 0; i < PagesNeeded; i++) 
    { 
     LocalPage = i; 
     MainMemory.Pages[i].ProgramOwner = programNumber; 
     MainMemory.Pages[i].LocalPageNumber = LocalPage; 
    } 
    cout << "hey3"; 
    if(PagesNeeded > PagesPerProgram) 
     PagesNeeded = PagesPerProgram; 

    for(int i = 0; i < PagesNeeded; i++) 
    { 
     MainMemory.Programs[programNumber].MemoryMap[i].first = MainMemory.Pages[i].LocalPageNumber; 
     MainMemory.Programs[programNumber].MemoryMap[i].second = 1; 
     if(pageAlgorithm == "clock") 
     MainMemory.Pages[i].TimeStamp = 1; 
     else 
     MainMemory.Pages[i].TimeStamp = 0; 
    } 
    } 
    fileIn.close(); 

    //LRU Algorithm Implementation 
    if(pageAlgorithm == "lru") 
    { 
    cout << "here1"; 
    fileIn.open(ProgramTraceFile.c_str()); 
    if(fileIn.fail()) 
    { 
     cerr << "That file does not exist." << endl; 
     fileIn.close(); 
     exit(1); 
    } 
    else 
    { 
     fileIn >> activeProgram; 
     fileIn >> requestedLocation; 
     newPageLocation = ceil(requestedLocation/pageSize); 
     while(!fileIn.eof()) 
     { 
     foundInMemory = false; 
     for(int i = 0; i < static_cast<int>(MainMemory.Programs[activeProgram].MemoryMap.size()); i++) 
     { 
      if((MainMemory.Programs[activeProgram].MemoryMap[i].second == 1) && 
     (MainMemory.Programs[activeProgram].MemoryMap[i].first == newPageLocation)) 
      foundInMemory = true; 
      if(foundInMemory) 
      break; 
     } 
     if(!foundInMemory) 
     { 
      pageFaults++; 
      if(static_cast<int>(MainMemory.Programs[activeProgram].MemoryMap.size()) < PagesPerProgram) 
      { 
      pair<int, int> temp; 
      temp.first = newPageLocation; 
      temp.second = 1; 
      MainMemory.Programs[activeProgram].MemoryMap.push_back(temp); 
      } 
      else 
      { 
      for(int i = 0; i < (static_cast<int>(MainMemory.Programs[activeProgram].MemoryMap.size()) - 1); i++) 
      { 
       if(MainMemory.Pages[i].TimeStamp >= MainMemory.Pages[i+1].TimeStamp) 
       { 
       MainMemory.Programs[activeProgram].MemoryMap[i].first = newPageLocation; 
       } 
       if(pageStyle == "1") 
       { 
       if(MainMemory.Pages[i].TimeStamp >= MainMemory.Pages[i+1].TimeStamp) 
       { 
        MainMemory.Programs[activeProgram].MemoryMap[i].first = MainMemory.Pages[i].LocalPageNumber; 
       } 
       } 
       MainMemory.Pages[i].TimeStamp++; 
      } 
      } 
     } 
     fileIn >> activeProgram; 
     fileIn >> requestedLocation; 
     newPageLocation = ceil(requestedLocation/pageSize); 
     } 
    } 
    } 

    cout << "------------------------------------" << endl; 
    cout << "Page Size: " << pageSize << endl; 
    cout << "Page Replacement Algorithm: " << pageAlgorithm << endl; 
    cout << "Paging Style: "; 
    if(pageStyle == "0") 
    cout << "Demand" << endl; 
    else 
    cout << "Prepaging" << endl; 
    cout << "Number of Page Faults: " << pageFaults << endl; 
    cout << "------------------------------------" << endl; 

    return 0; 
} 

bool checkPList(string programlistfile) 
{ 
    ifstream ListFile(programlistfile.c_str()); 
    if(ListFile.fail()) 
    { 
    cerr << "Cannot find file " << programlistfile << endl; 
    ListFile.close(); 
    return false; 
    } 
    else 
    { 
    ListFile.close(); 
    return true; 
    } 
} 

bool checkPTrace(string programTraceFile) 
{ 
    ifstream TraceFile; 
    TraceFile.open(programTraceFile.c_str()); 
    if(TraceFile.fail()) 
    { 
    cerr << "Cannot find file " << programTraceFile << endl; 
    TraceFile.close(); 
    return false; 
    } 
    else 
    { 
    TraceFile.close(); 
    return true; 
    } 
} 

bool checkPageStyle(string pageStyle) 
{ 
    if(pageStyle == "0") 
    return true; 
    else if(pageStyle == "1") 
    return true; 
    else 
    { 
    cerr << "Page Style can be: 0 or 1." << endl; 
    return false; 
    } 
} 

bool checkPageSize(int pagesize) 
{ 
    bool isValid = false; 
    switch(pagesize) 
    { 
    case 1: 
     isValid = true; 
     break; 
    case 2: 
     isValid = true; 
     break; 
    case 4: 
     isValid = true; 
     break; 
    case 8: 
     isValid = true; 
     break; 
    case 16: 
     isValid = true; 
     break; 
    default: 
     cerr << "Page Size can be: 1, 2, 4, 8, or 16." << endl; 
     isValid = false; 
    } 
    return isValid; 
} 

bool checkPageAlgorithm(string pageAlgorithm) 
{ 
    if(pageAlgorithm == "lru") 
    return true; 
    else if(pageAlgorithm == "fifo") 
    return true; 
    else if(pageAlgorithm == "clock") 
    return true; 
    else 
    { 
    cerr << "Valid Page Algorithms are: lru, fifo, or clock" << endl; 
    return false; 
    } 
} 

void checkArguments(int argc, char *argv[]) 
{ 
    if(argc < 6) 
    { 
    cerr << "Invalid number of arguments. Should be: programlist programtrace pagesize pagealgorithm pagingstyle" << endl; 
    exit(1); 
    } 

    else if(argc > 6) 
    { 
    cerr << "Invalid number of arguments. Should be: programlist programtrace pagesize pagealgorithm pagingstyle" << endl; 
    exit(1); 
    } 

    else if(!checkPageAlgorithm(argv[4])) 
    exit(1); 

    else if(!checkPageSize(atoi(argv[3]))) 
    exit(1); 

    else if(!checkPageStyle(argv[5])) 
    exit(1); 

    else if(!checkPTrace(argv[2])) 
    exit(1); 

    else if(!checkPList(argv[1])) 
    exit(1); 

    return; 
} 

“的输出heys”只是为了看看他们是否得到GDB内触发,他们没有。

+0

在gdb中键入'bt'来查看回溯。 – immibis 2015-04-01 04:06:39

回答

4

你忘了实际提出任何问题。

大概,你的问题是“为什么我的程序死于SIGABRT?”

答案是由程序本身提供的:您试图从NULL字符指针构造std::string,该指针会抛出异常(因为它不是一个有效的事情)std::logic_error异常。

您可能有后续问题:“我的程序在哪里发生了这种情况?”。

您可以使用GDB where命令找到答案。作为第一个猜测,你没有用足够数量的参数来调用你的程序。例如,如果你这样做:

gdb ./a.out 
(gdb) run 

然后argv[1]NULL,及本声明:

string programListFile = argv[1]; 

会扔你所得到的例外。

这个问题的常见解决方案是坚持要你有正确数量的参数,例如,把这个:

if (argc < 6) { 
    std::cerr << "Not enough arguments" << std::endl; 
    return 1; 
} 

main的开始。或者直接回复checkArguments()

+0

好吧,我一直在改变事情。我的班级现在看起来像: class Memory { public: vector Pages [numPrograms]; int Timestamp; }; 和在我的主,我在做:vector MainMemory;但是当我编译它时说我没有成员页面,也没有成员TimeStamp。为什么? – 2015-04-04 18:43:17

+0

@DougSteiert“为什么” - 这是一个单独的问题,你应该单独提出问题(并接受答案,如果它确实回答你的原始问题)。 – 2015-04-04 20:25:40