Core 파일 이용하여 Debugging하는 방법.

omando의 이미지

Unix에서 프로그램 실행시키는데 자꾸
Segment fault라는 메시지와 함께 core파일이 생성됨과 동시에 프로세스가

자동으로 죽는군요.(흑흑..심각한 버그)

코드상에 에러 발생할만한 곳은 모두 printf해놓았지만.

실제 어는 지점에서 fault발생하는건지 printf로는 알수가 없군요.

core파일을 이용하면 뭔가 해답이 있을듯 한데 어떻게 이용하는지를

몰라서요.

여전히 printf외에는 다른 좋은 디버깅 기법도 모르는 상태라서.

dreamer의 이미지

strace 라는 util을 써서 디버깅 해보세요
자세한 내용은 man strace 를 하시고요
segment falut라는 것은 보통 malloc같은 memery문제에서 발생할 가능성이 많으니까 그부분을 자세히 보면 해답이 있을 것 같네요..

eek의 이미지

./gdb 실행파일명 core
where 하면 어떤 부분이 문제가 생겼는지 알 수 있습니다.
그리고 stl을 사용하였다면 함수명하고 따라가시면 됩니다.

컴파일 하실때 -g 옵션으로 컴파일 하시면 더 자세한 정보가 남구요

팁 게시판에 가시면 자세한 디버깅에 관한 강좌가 있습니다. 그곳을 확인하세요.

man gdb

검색을 생활화 합시다.... ^^; :D

Perl 만세~~~

phhot의 이미지

gdb를 사용해서 debug하시고요..
gcc에서 -g옵션을 주시면 되고요
(ex) gcc -g -o test test.c
그다음 gdb test하시면 됩니다.
l을 누르면 소스와 라인번호가 보입니다.
여기서 break를 걸고 싶은곳에 bp 10을 하면 10라인에 break가 걸리게 하는겁니다.여기서 run을 하면 break걸어논 곳에서 멈추고 s로 한문장씩 실행시키는 거에요..

그리고 core 파일하려면 target core라는 것을사용한다는데..저도 안해봐서..

^^

omando의 이미지

답변 감사드립니다.

지금 프로그램을 돌린 Unix서버에는 gcc , gdb, trace, truss라는게 안깔려있더군요.(아쉽게도)

그리고 컴파일도 전 cxx 로 하였습니다.

제가 맘대로 깔고 말고 할 수 있는 여건이 안되거든요.

현 장비는 Compac Alpha Server입니다.

검색을 해보니, dbx라는것과 윗분이 말씀해주신 strace 라는 툴은 있더군요.

그런데 사용법을 익히는것도 만만치 않겠군요.

초보자를 위해 한글로 아주 간단한 사용법부터 기술되어 있는 자료는 없을까요?

그런데 strace로 디버깅하는 것은 혹시 프로세스가 살아있을경우에만 해당되는것 아닌가요? 제 프로그램은 다운되는에......

eek의 이미지

아네 그렇군요
tip게시판에 가시면 strace사용방법이 나와있는데요.. ㅋㅋ
간다한게 설명드리면
프로그램 실행시키고

strace -p 프로세서번호

이렇게 입력하시면 프로세서가 어떤 시스템 콜을 하는 지 알 수 있구요.
제일 권장하는 방법은 gcc와 gdb를 설치하는 방법입니다.
설치하실때 prefix를 주시면 됩니다. 그럼 시스템과 상관없이 설치가능하구요

Perl 만세~~~

omando의 이미지

답변 매우 감사드립니다.

 strace -p 프로세서번호 

이렇게 입력하시면 프로세서가 어떤 시스템 콜을 하는 지 알 수 있구요. 

그런데...그런데..아쉽게도 이방법을 사용하려면
프로세스가 살아있는 동안 얼렁 pid를 알아내어 위 명령어를 실행 시켜야
할터인즉,,, 제 프로그램은 시작하자 마자 얼마 안되어 곧 죽어 버리는군요.
:oops:

약간의 트릭을 써서 프로그램 내부에 sleep을 두어 약간의 지연을 해놓고
strace를 실행 시켰더니..
이번엔 usage:[mod_ID sub_ID pri_level]... 이란 메시지만 뜨고 아무일도
안하더군요.
대체 이와 같은 옵션은 무엇을 뜻하고 어떻게 지정해주어야 하는지요?

dreamer의 이미지

gdb 같은 debuger은 한 번 배울때 귀찮아도 배워 두면 너무 편리하니까
시간을 내서 배우는게 좋을 것 같구요

strace [command]

단순하게 이렇게 하시면 될텐데..
mach의 이미지

printf()를 사용한 디버깅에서는 반드시 fflush(stdout)을 같이 사용하셔야 합니다.

printf();
fflush(stdout);

그 이유는 printf()가 라이브러리 수준에서 버퍼링하기 때문입니다.
그래서, 특정 시스템호출에서 에러가 발생해도 엉뚱한 곳의 메시지가
출력이 될 수 있어서 printf()는 디버깅이 용이 하지 않지요.
따라서, printf()사용해서 core가 발생하는 정확한 위치를 잡으려면
위 코드 스타일처럼 코딩이 요구됩니다.

저는 개인적으로 write()를 선호합니다. 이는 라이브러리 수준 버퍼링이 없이
커널에 직접 출력을 요청하기 때문이지요.
이 경우에 포맷팅이 문제가 될 수 있습니다.
그래서 저는 다음과 같은 코드를 즐겨사용합니다.

char buff[4096];

......
sprintf( buff, "......", para1, para2...);
write( 2, buff, strlen(buff));
......

이를 라이브러리 형태로 만들어서 사용해도 좋겠지요.

또는 syslog()를 사용하는 방법도 좋다고 생각합니다.
그리고, 지금 논의되고 있는 디버깅도구들을 사용하는 것도 좋은 방법입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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