전역 static 이란? 그리고, gdb의 segmentation fault

alwaysN00b의 이미지

1. 회사에서 다른 분이 만든 프로그램이 오동작을 해서 보고 있습니다. 그런데... 이분이 참.. 깨끗하게도.. 주석이 하나도 없습니다. 그래서, gdb를 이용해 디버그를 할려구

Quote:

gdb foo1

하였는데.. -_-;;

Segmantation falut...

헉...
sun-e5500 solaris 2.6 입니다. (dbx 설치 안되어 있습니다. )
다른 프로그램들은 잘됩니다. (gdb otherprg)

2. static 으로 전역으로 선언했을시.. 물론 책을 찾아보고 기본적인 내용을 다시 복습하였습니다.

static struct 는 메모리에 다르게 올라가나요?

Quote:

static struct { char foo1[10]; char foo2[100]; char foon[BUFSIZ]; } foos[100];

이런 비슷한 코드가 전역으로 있길레..
뭐야.. static 일 필요가 없잖아. 라는 생각에 static을 빼고 컴파일하니 컴파일은 잘 되었는데 실행은 안되군요..( cgi/c , esql/c 사용하였습니다. 컴파일 옵션은 -static -g 주었구요.)

궁금한것은 static 이 뭔가 또 특별한 것이 있는가 하는 것입니다.

아직 초보라.. 검색어를 잘 모르겠습니다.(기껏 static , load 정도.. :oops: )
추천 검색어나 관련 문서 있으면 부탁드립니다.

angpoo의 이미지

전역 변수에 static을 붙이면
해당 소스에서만 유효하고
다른 소스에서는 액세스를 할 수 없습니다.

alwaysN00b의 이미지

angpoo wrote:
전역 변수에 static을 붙이면
해당 소스에서만 유효하고
다른 소스에서는 액세스를 할 수 없습니다.

알고 있던 내용이고, 2번에 다시한번 복습했습니다.

단일 파일이며 다른 함수선언전에 이미 선언(정의)되어있습니다.

.. 그리고, 질문중 1,2번은 같은 파일입니다.

gdb가 죽어버리니... -_-;;

언제나 시작

codebank의 이미지

segment fault라...

보통 static으로 선언을 해버리면 heap영역이 아닌 data영역에 데이터가 잡힌다고
알고 있습니다.
만일 static으로 정의된것이 많다면 내부 data영역이 넘쳐서 일어나는 현상이 아닐까
생각이 되네요.

해결방법일지는 모르겠지만 일단 struct는 typedef으로 정의해놓고 foos를 사용하는
함수내에서 malloc이나 new등을 이용해서 메모리할당을 해주는게 안전하지 않을까
생각됩니다.

예전에 DOS에서 프로그램할 때인데 직원한명이 컴파일이 잘 안된다고해서 봤더니...
전부 전역변수로 잡아서 일어나는 일이더군요. 물론 그 당시는 DOS였고 프로그램을
위한 메모리할당 자체가 부족한 상태였으니 당연한 일이겠지만...
요즘도 이런식으로 변수를 잡는 사람이 있을까 생각은 들지만 그럴 수도 있지않을까요?
될 수 있으면 배열은 포인터로 잡아놓고 프로그램 시작시에 메모리할당을 해주는게
좋지 않을까 생각되네요. 물론 끝내기전에 메모리해제는 필수겠지만요. :)

------------------------------
좋은 하루 되세요.

alwaysN00b의 이미지

codebank wrote:
segment fault라...

보통 static으로 선언을 해버리면 heap영역이 아닌 data영역에 데이터가 잡힌다고
알고 있습니다.
만일 static으로 정의된것이 많다면 내부 data영역이 넘쳐서 일어나는 현상이 아닐까
생각이 되네요.

아.. 답변이 달리기 전에 해결해서 늦게 읽었습니다.

답글 감사합니다. :D

data영역에 저장된다는 사실은 알고 있었는데, 제한이 있다는건 몰랐습니다.

월요일날 출근해서 고쳐봐야겠습니다.(전역 static이 무지하게 많거든요)

언제나 시작

pynoos의 이미지

truss 로 실행해보세요. gdb 가 살을 째는 외과 수술이라면, truss 는 내시경입니다.

truss ./foo1

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.