Segmentation fault (core dumped) 에러에 관하여

글쓴이: 익명 사용자 / 작성시간: 금, 2002/11/01 - 11:26오후
프로그램을 실행시켰을때 Segmentation fault (core dumped) 에러가 발생합
니다. 근데 신기하게도 이러한 메세지가 나오지만 결과는 제대로 잘 나오고 있
습니다. 무슨 문제일까요?
제가 처음에는 Visual C++ 6.0 에서 실행하였을때 메모리 문제때문에
stack overflow가 생겨서 local변수로 선언되었던 것을 global변수로 만들
어서 문제를 해결하였습니다. 이 소스를 linux로 옮겼을때도 지역변수가 아닌
global변수로 만들어 주었으며, 기존의 방법에서는 배열로 만들었던것을
calloc로 만들어서 사용을 하였습니다. 제가 영상처리에 관련된 프로그램을
해서 메모리의 문제가 아닐까 해서 calloc로 메모리를 잡아서 사용을 하였습니
다.
제가 디버그를 하고 싶어서 printf를 찍어서 실행을 시켜보았는데요, 처음에
파일을 입력 받는부분을 scanf로 만들었는데 그 부분을 제외하고, 중간에
printf문을 만들었던 부분은 전혀 찍히지는 않고 결과만 제대로 나옵니다.
고수님들 답변 부탁드립니다. 혹은 메일로 주십시요....
오늘도 즐거운 하루를 보내시길 바랍니다.
Forums:
Re: Segmentation fault (core dumped) 에러에 관하여
유혜원 wrote..
프로그램을 실행시켰을때 Segmentation fault (core dumped) 에러가 발 생합
니다. 근데 신기하게도 이러한 메세지가 나오지만 결과는 제대로 잘 나 오고 있
습니다. 무슨 문제일까요?
제가 처음에는 Visual C++ 6.0 에서 실행하였을때 메모리 문제때문에
stack overflow가 생겨서 local변수로 선언되었던 것을 global변수로 만들
어서 문제를 해결하였습니다. 이 소스를 linux로 옮겼을때도 지역변수 가 아닌
global변수로 만들어 주었으며, 기존의 방법에서는 배열로 만들었던것 을
calloc로 만들어서 사용을 하였습니다. 제가 영상처리에 관련된 프로그 램을
해서 메모리의 문제가 아닐까 해서 calloc로 메모리를 잡아서 사용을 하였습니
다.
윈도는 스택을 예약 공간, 실제 커밋 공간, 가드 페이지 등으로 구분해서
관리합니다. 즉 쓰레드를 생성할 때 예약 공간이 1MB일지라도 커밋
공간이 8kB(x86의 2페이지)면 8kB만 일단 스택으로 할당을 합니다. 이중
위의 페이지만 실제로 사용하고 밑의 페이지는 스택이 흘러넘치는지
감지하기 위한 가드 페이지로 사용합니다. 오버플로우가 감지되면
가드 페이지를 스택으로 할당하고 그밑의 페이지를 새로 가드 페이지로
잡는 것이죠.
말씀하신 경우라면 지역 변수를 8kB이상의 배열로 설정하고 끝의 부분을
바로 접근했을 때 오버플로우 에러가 났을 가능성이 있습니다. malloc나
calloc를 쓰신다면 굳이 변수를 전역으로 선언하지 않더라도 더이상 에러
가 나지 않을 겁니다. 또는 지역변수(배열)를 static으로도 선언해 보세
요(바람직한 방법은 아닙니다만).
제가 디버그를 하고 싶어서 printf를 찍어서 실행을 시켜보았는데요, 처음에
파일을 입력 받는부분을 scanf로 만들었는데 그 부분을 제외하고, 중간 에
printf문을 만들었던 부분은 전혀 찍히지는 않고 결과만 제대로 나옵니 다.
고수님들 답변 부탁드립니다. 혹은 메일로 주십시요....
오늘도 즐거운 하루를 보내시길 바랍니다.
전혀 찍히지는 않았는데 결과가 나온다니 무슨 뜻인지...? ;-)
Re^2: Segmentation fault (core dumped) 에러에 관하여
제 프로그램은 영상 파일을 하나 입력을 받아서, 파일을 생성하는 겁니다.
비록 segmentation falult에러 메세지가 나오지만 파일이 하나 생성이 됩니다
그래서 그 파일을 보았더니 제가 윈도우에서 프로그램했던 결과와 똑 같습니다
전혀 문제가 없구요. 그러니 더욱더 답답합니다. 전에는 segmentation falut
에러가 나오면 파일이 생성되지 않았었는데 지금은 파일이 생성이 되어서
제대로 결과가 나오기때문입니다.
그리고 전에는 printf로 찍어봐서 어느 부분에 문제가 있는지 감지를 할 수가
있었는데, 지금은 전혀 printf로 감지가 되지 않고, 결과만 잘 나오고 있습니
다.
고수님들 제발 답변 부탁드립니다.
그럼 오늘도 즐거운 하루를 보내십시요
혹시...
printf() 문을 쓰실 때 잘못 쓰신 것 아닌가요?
포멧정의와 전달한 아큐먼트가 틀린다든가 하는 식으로요.
%s 같은거 하나 잘못 쓰면 그냥 죽어버릴 수 있거든요.
때로는 잘못된 디버깅코드 때문에 엄한곳에서 삽질하는 경우가 있거든요..
혹시 gcc 쓰신다면 컴파일 옵션에 -Wformat 정도 넣으셔서 확인해 보세요.
그럼 이만,,
GDB로 찍어보세요. ^^;;
만약 파일의 이름이 test라면.
--------------------------------------------
$./test
...
Segmentation fault core dump.!!!
--------------------------------------------
이때 ls를 수행해보면 현재 디렉토리에 core파일이 생성되어 있죠?
--------------------------------------------
$ls
... core
--------------------------------------------
그리고 gdb 실행파일 + core로 호출하면, 프로그램이 크래쉬된
원인이 있는 곳의 소스 라인을 지적해 줍니당~ ^^;;
--------------------------------------------
$ gdb test core
... GDB 세션
...
17 temp[i] = buff [i];
이것땜에 플램이 죽었음... ^^
--------------------------------------------
이런식으로 잡으면 되던데요... ^_^;;
Re^2: GDB로 찍어보세요. ^^;;
님께서 말씀하신데로 gdb를 이용하였는데, 다음과 같은 메세지가 나옵니다.
warning exec file is newer than core file.
Core was generated by `./result'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/i686/libm.so.6...done.
Loaded symbols for /lib/i686/libm.so.6
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x00000000 in ?? ()
위와 같은 메세지가 나오는데 전 무슨 문제인지 전혀 감이 오지 않네요...^^
답변 부탁드립니다.
Re^3: Segmentation fault (core dumped) 에러에 관하여
혹시...
실제 결과를 위한 연산은 다 맞았는데,
마지막에 화일 close 한다음이라든가 또는 모든 연산결과를 저장한 후에
무슨 포인터 에러가 난것이 아닐까요?
그러니깐 연산도 제대로 됐고,
결과도 제대로 찍혔고.. 그랬는데..
문제는 다~ 한담에 실제 원하는 플밍과는 좀 무관한 작업을 하시다가 그런
선 아닐까 싶은데..
Re^3: GDB로 찍어보세요. ^^;;
짦은 코드라면 함 올려봐 주세여~ ^^;;
죄송합니다....^**^
죄송합니다만 소스의 양이 짧지는 않습니다. 그리고 프로젝트와 관련된
프로그램이라 소스를 공개할수가 없습니다. 정말 죄송합니다.
이 프로그램이 제대로 완성이되면 미 Univ. of Massachusetts에 보내줘야
하거든요.....근데...제가 올렸던 에러의 내용이 뭔지 혹시 알고 계십니까?
답변 부탁드립니다.
Re: Segmentation fault (core dumped) 에러에 관하여
GDB 로 trace하는것이 최선의 방법입니다.
아니면 printf대신 fprintf로 console이 아닌
파일로 출력해 보심을 권합니다.
core로 디버깅하기
아마도 in()이라는 함수 안에서 NULL 포인터에 뭔가를 쓴게 아닌가 싶습니
다만... ^^;; (추측입니다.)
아래는 gdb를 돌리는 화면을 넣어봤습니다.
pointer-q.c라는 파일은 포인터에다가 배열값을 쓰려하는 문제를 지닌
프로그램인데요. (C에서 문자열처리하다 많이 겪죠? -_-;;)
GDB로 추적하는 모습입니다.
참고하시면 도움이 될 듯 하네요. ^^;;
====================================================================
g++ pointer-q.o -o pointer-q
[mjpark@jross77 cppprog]$ ./pointer-q
Segmentation fault (core dumped)
[mjpark@jross77 cppprog]$ gdb ./pointer-q pointer-q.c core
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-redhat-linux"...
Core was generated by `./pointer-q'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libstdc++-libc6.2-2.so.3...done.
Loaded symbols for /usr/lib/libstdc++-libc6.2-2.so.3
Reading symbols from /lib/libm.so.6...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x400ee3a8 in _IO_fgets (buf=0xbfffd900 "", n=8192, fp=0x0) at
iofgets.c41
41 iofgets.c No such file or directory.
(gdb)
(gdb) b 20
Breakpoint 1 at 0x8048655 file pointer-q.c, line 20.
(gdb) run
Starting program /home/mjpark/cppprog/./pointer-q
Breakpoint 1, main () at pointer-q.c20
20 ifile=fopen("abc.txt","r");
(gdb) n
21 memset(buff, 0x00, sizeof(buff));
(gdb) n
22 fgets(buff, BUFSIZ, ifile); <== 이 부분이 문제임
(gdb) n <== 다음으로 넘어가면 오류 발생 그러므로 윗줄을 보면 됨
Program received signal SIGSEGV, Segmentation fault. <= 오류 발생
0x400ee3a8 in _IO_fgets (buf=0xbfffd8f0 "", n=8192, fp=0x0) at
iofgets.c41
41 iofgets.c No such file or directory.
(gdb)
====================================================================
node에서 발생한 적 없나요?
nodejs를 ubuntu에 설치후 같은 에러메시지 나오는데
혹시 힌트 없을까요?
댓글 달기