Segmentation fault (core dumped) 이 발생하는데 이유를 모르겠어요

noard의 이미지

#include "main.h"
 
struct PCINFO {
        string pname;
        int arrtime;
        int srvtime, srvdtime, tt, wt;
	string srvst;
	bool flg;
}pcinf[MAXPC];
int Tst,Ast,pcnum;
float Twt,Awt;
 
 
void cpuschedule::Getdata(char* fn)
{
	int i=0, j=0;
	struct PCINFO tmp;
	Tst = 0;
 	ifstream fin(fn);
	if(!fin) cout<<"Data file is not exist!"<<endl;
	while(!fin.eof()) {
		fin >> pcinf[pcnum].pname >> pcinf[pcnum].arrtime >> pcinf[pcnum].srvtime;
		++pcnum;
	}
	fin.close();
	cout<<pcnum<<endl;
	--pcnum;
	cout<<"File open is succcess"<<endl;
 	for (i=0; i<pcnum; i++) {
		pcinf[i].flg = 0;
        }
	Tst+= pcinf[0].arrtime;
 
 
	for (i=pcnum;i>=1; i--)
	{
		for(j=1;j<pcnum; j++)
		{
			if(pcinf[j-1].arrtime>pcinf[j].arrtime)
			{
				tmp = pcinf[j-1];
				pcinf[j-1] = pcinf[j];
				pcinf[j] = tmp;
			}
		}
	}
 
/*	for (i=0; i<pcnum;i++) {
		cout<<pcinf[i].pname << " "<< pcinf[i].arrtime <<" "<< pcinf[i].srvtime << endl;
	}
*/	
}
 
 
void cpuschedule::Srt(){
	int i=0,j=0,k=0,l,cnt=0;
	cpuschedule c;
/*	for (i=0; i<pcnum;i++) {
                cout<<pcinf[i].pname << " "<< pcinf[i].arrtime <<" "<< pcinf[i].srvtime << endl;
	}
*/
	while(cnt<MAXCPUTIME) {
		if(cnt<pcinf[0].arrtime){
			for(l=0; l<pcnum; l++){
				pcinf[l].srvst+=' ';
			}
			cout<<"state1"<<endl;
			c.Print(cnt);
	 		cnt++;
			continue;
		}else if(cnt==pcinf[0].arrtime){
			for(l=0; l<pcnum; l++){
				if(l==0){
					pcinf[l].srvst+='-';
					pcinf[l].srvdtime++;
				} else pcinf[l].srvst+=' ';
			}
			c.Print(cnt);
			cnt++;
			continue;
		}
		for(i=0; cnt>pcinf[i].arrtime;) i++;
		j=i;
		for(i=0; i<=j; i++){
			if(pcinf[i].flg!=1){
				k=i;
				break;
			}
		}
//		cout<<"k = "<<k<<" k가 완료되지 않은 제일 먼저 도착한 값을 가리키게 된다"<<endl;
		for(i=0; i<j; i++) {
			if(pcinf[i].flg!=1 && (pcinf[i].srvtime-pcinf[i].srvdtime < pcinf[k].srvtime-pcinf[k].srvdtime)) {
				k=i;
			}
		}
//		cout<<"k = "<<k<<" k가 완료되지 않은 제일 작은 Servetime을 가진 값을 가리키게 된다"<<endl;
		if(pcinf[k].srvtime-1==pcinf[k].srvdtime){
			for(l=0; l<pcnum; l++){
                                if(l==k){
                                        pcinf[l].srvst+='+';
                                        pcinf[l].srvdtime++;
					pcinf[l].flg=1;
                                } else pcinf[l].srvst+=' ';
                        }
			cout<<"state2"<<endl;
			c.Print(cnt);
			cnt++;
			continue;
		} else if(pcinf[k].srvtime-1>pcinf[k].srvdtime){
			for(l=0; l<pcnum; l++){
                                if(l==k){
                                        pcinf[l].srvst+='-';
                                        pcinf[l].srvdtime++;
                                } else pcinf[l].srvst+=' ';
                        }
			cout<<"state3"<<endl;
			c.Print(cnt);
			cnt++;
			continue;
		}
 
 
	}	
}
 
void cpuschedule::Print(int cnt){
	int i, j;
	for(i=0; i<cnt; i++){
		system("clear");
		cout<<cnt<<"번째 화면"<<endl;
		for(j=0; j<=pcnum; j++){
			cout<<pcinf[j].pname<<"\t"<<pcinf[j].srvst<<endl;
		}
	}
	sleep(1/2);
}

파일에서 데이터를 입력받고 분리 한다음에 스케쥴링 하는 프로그램인데요
20여번 정도 까지 실행이 되다가 세그멘테이션 오류가 발생하는데..
이유를 못찾겠네요..
File attachments: 
첨부파일 크기
Binary Data qu.tar.gz10.88 KB
binoopang의 이미지

GDB로 해당 프로그램 돌려 보시구요
아마 GDB에서도 segmentation fault 발생할 거에요
그때 어떤 메모리 주소에서 발생한건지 출력해 줄 겁니다.
그 주소 부근의 어셈블리 코드 확인하시고 C 코드에서 어느 부근인지 살펴보세요

보통 segmentation fault 는 버퍼 문제가 많으니 그 근처를 중심으로 보심이 ^^

-------- 시그내쳐 ---------
열심히 열심히 열심히 ..
음악을 하는것 처럼!!

noard의 이미지

GDB 사용법을 좀 알아봐야겠네요~^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.