segmentation fault

auditory의 이미지


g++-3.4로 컴파일한 코드가 있습니다..

이 코드가 CentOS 에서는 잘 동작합니다.
$ uname -a
Linux localhost.localdomain 2.6.18-194.32.1.el5 #1 SMP Wed Jan 5 17:52:25 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

그런데 최근 kernel update를 하고난뒤로 실행시키면,
바로 segfault가 납니다..

그래서 예전 커널로 부팅을하면 다시 잘 동작합니다.

ubuntu에서도 동일하게 segfault가 납니다.
$ uname -a
Linux ubuntu 2.6.35-28-server #49-Ubuntu SMP Tue Mar 1 14:55:37 UTC 2011 x86_64 GNU/Linux

그런데 gdb에서 돌리면 동작합니다..

이 문제를 해결하려면 어떻게 접근해야할까요?

어쩌면 문제의 원인은 g++-3.4로 컴파일하기때문인것도 같은데요..
그런데 코드가 예전코드라 >4.0 버전으로는 컴파일이 안됩니다..

auditory의 이미지

질문이 좀 막연해서 그런지 답변이 없네요...

그러면

gdb에서 실행하면 동작하는데,

그냥 직접 실행하면 segmentation fault가 나는 문제는

어떻게 원인을 찾아야할까요?

semmal의 이미지

초기화 문제일 가능성이 크지 않을까요?
디버거에서는 초기화를 자동으로 해주는 경우가 많으니...

------------------------------
How many legs does a dog have?

auditory의 이미지

코드상의 문제같지는 않은것이,

argument 없이 실행시키면 usage를 출력하도록 되어있는데,

여기까지도 실행이 안되고 seg fault가 납니다..

테스트로 main의 제일 첫줄에 printf를 넣었는데, 여기까지도 출력이 안됩니다..

library version문제라든가.. 그런 방향으로는 문제가 없을까요??

semmal의 이미지

링크하는 라이브러리가 디버그나 릴리즈 일때 다른가요?

릴리즈 버전일 때 뭔가 링크가 제대로 이뤄지지 않을 수도 있을 것 같구요.

말씀대로 버전 문제일 수도...

아니면 최적화가 잘못되었거나?

또는, 이전에 빌드한 o 파일이 시스템이 바뀌었는데도 다시 컴파일 되지 않고 남아있는 경우?

------------------------------
How many legs does a dog have?

auditory의 이미지


디버그 옵션을 넣고 컴파일한 동일한 바이너리에 대해서

command line에서 실행하면 바로 seg fault
gdb 에서 실행하면 정상적으로 usage 가 출력

되는 상황입니다...

관심가져주셔서 감사드립니다..

gloomyr의 이미지

저도 비슷한상황인데 ..
해결하셨다면 약간 힌트좀 ..

auditory의 이미지

해결이 되지 않은 상태입니다..
그런데 보통은 초기화 문제일 겁니다..

디버거 상에서 초기화되지 않은 변수들을 0으로 setting하는데,
이 과정이 빠져서 seg fault가 나는건 아닌지 확인해보시면 좋겠네요..

compiler warning message도 다시 보시고요..

제 문제는 시작하자마자 최초 statement에서 죽는 문제라서
초기화 문제는 아닌것으로 판단하고 있습니다...

cinsk의 이미지

$ ldd 프로그램

결과와, gdb에서 해당 프로그램을 실행(run)한 다음 (main에 breakpoint 걸고),

(gdb) info sharedlibrary

결과를 보여주세요.

auditory의 이미지

댓글 감사드립니다. 상황은 아래와 같습니다.

auditory@ubuntu:~$ ./a.out
세그멘테이션 오류
auditory@ubuntu:~$ ldd ./a.out
        linux-vdso.so.1 =>  (0x00007fffcf9ff000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fc552cc6000)
        libm.so.6 => /lib/libm.so.6 (0x00007fc552a43000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fc55282c000)
        libc.so.6 => /lib/libc.so.6 (0x00007fc5524a9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc552fe0000)
auditory@ubuntu:~$ gdb ./a.out
GNU gdb (GDB) 7.2-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/auditory/a.out...done.
(gdb) break main
Breakpoint 1 at 0x404c51: file main.cpp, line 36.
(gdb) run
Starting program: /home/auditory/a.out
 
Breakpoint 1, main (argc=1, argv=0x7fffffffe308) at main.cpp:36
36              fprintf( stderr, "end\n" );
(gdb) info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7ddcaf0  0x00007ffff7df5a64  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7b2dd60  0x00007ffff7b98916  Yes (*)     /usr/lib/libstdc++.so.6
0x00007ffff7856ef0  0x00007ffff78972d8  Yes (*)     /lib/libm.so.6
0x00007ffff763f8b0  0x00007ffff764efe8  Yes (*)     /lib/libgcc_s.so.1
0x00007ffff72d8a00  0x00007ffff73eb920  Yes (*)     /lib/libc.so.6
(*): Shared library is missing debugging information.
(gdb) l
31      }
32
33      int
34      main(int argc, char** argv)
35      {
36              fprintf( stderr, "end\n" );
37              return 0;
38      }
(gdb) continue
Continuing.
end
 
Program exited normally.
(gdb)

아래는 정상적으로 동작하는 CentOS 상에서의 ldd 결과입니다.

$ ldd ./a.out
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003d36200000)
        libm.so.6 => /lib64/libm.so.6 (0x0000003d31600000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003d34e00000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003d30e00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003d2fe00000)

linux-vdso.so.1 이 문제인 것처럼 보이네요..
http://www.ibm.com/developerworks/linux/library/l-lpic1-v3-102-3/
에 따르면

The library that you see as linux-vdso.so.1 is a virtual library or Virtual Dynamic Shared
Object, that resides only in each program's address space. Older systems called this 
linux-gate.so.1. This virtual library provides the necessary logic to allow user programs 
to access system functions through the fastest means available on the particular 
processor, either interrupt, or with most newer processors, fast system call.

라고하는데, 어떻게 수정해야할지는 잘 모르겠네요..

cinsk의 이미지

vdso가 문제될 경우는 없구요, 제 생각엔 heap 관련 프로그램 버그가 아닐까 합니다. 일단 core 파일을 만들어서 gdb로 backtrace 해보시는 걸 추천합니다.

소스가 있다면 duma(efence)로 링크한 후 실행 또는 valgrind로 실행해 보세요.

auditory의 이미지

결과입니다. main함수 내용이 워낙 간단해서 별로 정보가 없습니다..

~$ gdb ./a.out core
GNU gdb (GDB) 7.2-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/pkyoung/a.out...done.
[New Thread 4165]
 
warning: Can't read pathname for load map: 입력/출력 오류.
Reading symbols from /usr/lib/libstdc++.so.6...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Core was generated by `       '.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000000000 in ?? ()
(gdb) backtrace
#0  0x0000000000000000 in ?? ()
Cannot access memory at address 0x7fff8b233600
(gdb) l
32
33      int
34      main(int argc, char** argv)
35      {
36              fprintf( stderr, "end\n" );
37              return 0;
38      }
(gdb)
라스코니의 이미지

> gdb ./a.out ./core

로 해서 다시 올려 보세요. 지금 path를 못찾는다고 에러 났습니다.

auditory의 이미지

동일한 결과입니다..
path문제는 아닌것 같은데요...

cinsk의 이미지

제가 질문을 잘못 봤군요. heap 관련 버그는 아닐 듯 싶습니다. 혹시 컴파일러와 C++ library 버전 등이 꼬인 것은 아닌지요.

libc, libstdc++ 등의 debugging package를 설치하면 좀 더 정확한 backtrace가 나오지 않을까 합니다.

auditory의 이미지

"컴파일러와 C++ library 버전 등이 꼬인" 상황을 의심하고 있습니다.

아무래도 g++-3.4로 컴파일한다는 것 자체가 문제겠지요..
커널 마이너 업데이트에 따라서 문제가 생겼다 안생겼다 하는데,
원인을 찾기가 쉽지 않네요..

현재는 커널을 업데이트 하지 않는 것으로 문제를 해결하고 있고, -_-;;
debugging package를 설치하여 디버깅을 더 하는 것은 미루고 있습니다.

오히려 최신 버전의 컴파일로 컴파일 가능하도록 소스를 고치는게
더 어렵긴 하지만, 근본적인 방법일 것 같습니다..

관심 가져주셔서 감사합니다.

라스코니의 이미지

core dump 해 보셨나요? 어디에서 seg fault가 나나요?

auditory의 이미지

윗글에 core dump결과 올려두었습니다.

관심가져주셔서 감사합니다

gloomyr의 이미지

이전에 세그먼트 폴트 날때 valgrind 실행해보니
1073533 사용한다고 나와서

./exe --mainstack-size = 16MB

해서 실행시켰엇거든요
정확한 근거는 없이 느낌인데 저이후로 실행이후 그냥 세그폴트납니다. 이전에는 좀 돌다가 세그폴트 났었는데..
-- cinsk 님 댓글에 heap 오류 라는 말에 생각나서 적어봅니다.

저렇게해주는건 reboot 하면 메인스텍사이즈가 디폴트값으로 다시 되돌아 가나요?
아니면 다시 메인스텍사이즈를 디폴트값으로 잡아줘야 적용되는건가요?

./exe --mainstack-size = default

이렇게하면 디폴트로 되돌아 갈까요 ``

auditory의 이미지


저도 잘 모르겠지만, 이 글에 대한 답글은
새로 올리신 글타래에 달아두었습니다.

앞으로 이와 관련된 글은 그쪽 글타래에 올려주시면
양쪽 이슈에 해결책이 좀더 분명하게 찾아질 것 같습니다.. ^^;

gloomyr의 이미지

흠 전혀 엉뚱하게 해결이 되었네요
저같은경우는 예를 들어

int a[max] 배열이 있으면

어느 아주 깊숙한 콜 함수에서
int x = value % value2 ;
a[x] = ~~

같은 코드에서 x 갑이 max 보다 1큰갑이 들어와서
a[x] 값이 EBP 값을 건드리네요 ㅋㅋ
그래서 폴트가 났엇구요.. 환경적인 문제인줄 알앗는데 코드상의 문제 일줄은..

GDB 로 실행시키면 함수안에 다른 심볼이 삽입이 되서 인덱스 1 더 벗어난것이 EBP 값이 아닌 다른 심볼 주소를 건드나 봅니다.(추측)
그래서 디버그모드로 돌리면 세그폴트가 안나는 것이였던거겟죠??

아직 해결이 안되셨다면 코드문제일수도 있으니 한번 코드를 찬찬히 보시는것이..

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.