分段错误(核心转储)向 linux 发出窗口

Posted

技术标签:

【中文标题】分段错误(核心转储)向 linux 发出窗口【英文标题】:Segmentation Fault (Core Dumped) issue windows to linux 【发布时间】:2014-01-31 18:01:13 【问题描述】:

我一直在 Windows 上使用 Visual Studio 进行编程,我的代码运行良好,但是在 Ubuntu 上运行它时,我得到了一个

分段错误(核心转储)

问题,我不知道是什么原因造成的。我不知道问题出在代码的哪个位置,所以我把它全部粘贴了。

#include "Person.h"
#include "Grade.h"

using std::ifstream;
using std::ofstream;
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::stringstream;
using std::fixed;
using std::setprecision;
using std::setfill;

unsigned z = 0;
unsigned y = 0;

void firstInput(vector<Person>& peoples, char *argv[])

int x = 0;
string idy, namey, addressy, phoney, s;

ifstream one;
one.open(argv[1]);

while (getline(one, s))

    if (x == 0)
    
        idy = s;
    

    if (x == 1)
    
        namey = s;
    

    if (x == 2)
    
        addressy = s;
    

    if (x == 3)
    
        phoney = s;
        Person *f1 = new Person(idy, namey, addressy, phoney);
        peoples.push_back(*f1);
        x = -1;
    

    x++;



one.close();


void secondInput(vector<Grade>& gradies, char *argv[])

int b;
string z, idy2, gradey, classy;

ifstream two;
two.open(argv[2]);

b = 0;

while (getline(two, z))

    if (b == 0)
    
        classy = z;
    

    if (b == 1)
    
        idy2 = z;
    

    if (b == 2)
    
        gradey = z;
        Grade *g1 = new Grade(classy, idy2, gradey);
        gradies.push_back(*g1);
        b = -1;
    
    b++;


two.close();


double scoreConverter(string lettergrade)

double converted = 0.0;

if (lettergrade.substr(0,1) == "A")

    converted += 4;


if (lettergrade.substr(0,1) == "B")

    converted  += 3;


if (lettergrade.substr(0,1) == "C")

    converted += 2;


if (lettergrade.substr(0,1) == "D")

    converted += 1;;


if (lettergrade.size() > 1)

    if (lettergrade.substr(1,2) == "-")
    
        converted -= 0.3;
    
    if (lettergrade.substr(1,2) == "+")
    
        converted += 0.4;
    

return converted;


void computeGPA(vector<Grade>& s, vector<Person>& p, string IDnum)

int count = 0;
y = 0;
double gpa = 0;

    for (string x = IDnum; y < s.size(); y++)
    
        if (x == s.at(y).getIDs())
        
        gpa += scoreConverter(s.at(y).getScore());
        count++;
        
       
        if (gpa > 0)
        
        gpa = gpa / count;
        
        cout << IDnum << "    ";
        cout << fixed << setprecision(2) << setfill('0') << gpa << "    ";

    for (unsigned x = 0; x < p.size(); x++)
    
        if (IDnum == p.at(x).getID())
        
            cout << p.at(x).getName() << endl;
            x = 1000;
        
    

    z = y;


void thirdInput(vector<Grade>& gradies, vector<Person>& persons, char *argv[])

string querying;

ifstream three;
three.open(argv[3]);


while(getline(three, querying))

for (unsigned x = 0; x < persons.size(); x++)

    if (querying == persons.at(x).getID())
    
        computeGPA(gradies, persons, persons.at(x).getID());
        x = 1000;
    




int main(int argc, char *argv[]) 

ofstream outputit;
outputit.open(argv[4]);

std::ofstream out(argv[4]);
std::cout.rdbuf(out.rdbuf());

vector<Person> people;
vector<Grade> grades;

firstInput(people, argv);

std::sort(people.begin(), people.end());

    for (unsigned x = 0; x < people.size(); x++)
    
        cout << people.at(x).getName() << endl;
        cout << people.at(x).getID() << endl;
        cout << people.at(x).getPhone() << endl;
        cout << people.at(x).getAddress() << endl;
    

    cout << endl;

secondInput(grades, argv);

std::sort(grades.begin(), grades.end());

for (unsigned x = 0; x < grades.size(); x++)

    cout << grades.at(x).getIDs() << "    ";
    cout << grades.at(x).getScore() << "    ";
    cout << grades.at(x).getClass() << endl;


cout << endl;

thirdInput(grades, people, argv);

outputit.close();

【问题讨论】:

PersonGrade 是如何定义的? 您可以根据它在崩溃之前打印的内容来确定它在哪里崩溃。如果它在崩溃之前没有打印任何内容,请添加输出语句直到获得一些输出。 除了“它在哪里崩溃”之外,了解您在崩溃之前提供的输入会很有帮助。 缩进代码是让更多人愿意查看的好方法。 【参考方案1】:

为了找出分段错误发生的位置,您可以使用gdb

使用-ggdb 编译您的程序,假设您使用的是 GCC。

使用以下命令运行程序:

gdb myprog myinputs.txt

进入gdb 提示符后,输入run。一旦进程分段出错,您应该返回gdb 提示符。从那里,您可以键入bt 以获取回溯。

这应该为您提供足够的信息来调查您的错误。

【讨论】:

【参考方案2】:

这可能会发生,因为默认情况下分配给 g++ 编译器的内存是堆栈的 8192 KB,而 Windows 机器不是这种情况。您可以通过在终端中键入以下命令来检查发行版的可用内存:

ulimit -s

ulimit 是每个进程打开的文件描述符的数量。因此,以这样一种方式初始化变量,即程序不会使用超过 8192 KB 的内存,例如使用 short int 代替 int(请记住不会发生溢出)。或者,您可以将堆栈的 ulimit 设置为无限制,并在终端中输入以下内容后编译相同的代码:

ulimit -s unlimited

unlimited的位置,您也可以分配自定义内存,例如,如果您要分配10000 KB,则应写入ulimit -s 10000

我希望这能解决问题。

【讨论】:

以上是关于分段错误(核心转储)向 linux 发出窗口的主要内容,如果未能解决你的问题,请参考以下文章

分析分段错误核心转储 (gdb)

分段错误(核心转储)错误 C linux 套接字

获取“分段错误核心转储”

分段错误(核心转储)

为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]

运行我的代码时出现分段错误(核心转储)问题