리눅스에서 사용할 수 있는 다양한 C 디버깅 툴들을 알고 싶네요

shs0917의 이미지

저는 아직 학생인데요...

프로젝트 할때마다 디버깅 때문에 골치가 아픕니다..

디버깅 노가다에서 조금이나마 해방될 수 있는

노하우를 좀 가르쳐 주세요...

pynoos의 이미지

http://bbs.kldp.org/viewtopic.php?t=1045

system call tracer는 기본이고, ltrace라는 library tracer..

그리고 가장 많이 사용하는 gdb

그리고, tool 말고 debugging용 메모리 관련된 library들이 많이 있습니다.

ssik425의 이미지

음 좀더 편한 툴을 원한다면

ddd라는게 있습니다.

물론 gdb에 기반을 두고 있지만 검은 화면이

보기 어렵다면 추천 해드립니다.

하지만 쓰다 보니 gdb만한 것이 없더군요..

개발자들의 궁극적 비전은 ?

youlsa의 이미지

Emacs에서 gdb연결해서 써보세요. 키 몇개만 매핑 해 놓으면 IDE 수준의 디버깅을 할 수 있습니다.

=-=-=-=-=-=-=-=-=
http://youlsa.com

낙엽의 이미지

youlsa wrote:
Emacs에서 gdb연결해서 써보세요. 키 몇개만 매핑 해 놓으면 IDE 수준의 디버깅을 할 수 있습니다.

저는 vi만 계속 써 왔습니다.
Emacs와 gdb를 연결해서 사용하는 것에 대해서는 예전부터 들어 왔는데 참고될 만한 사이트를 좀 말씀해 주시겠습니까?

youlsa의 이미지

낙엽 wrote:
youlsa wrote:
Emacs에서 gdb연결해서 써보세요. 키 몇개만 매핑 해 놓으면 IDE 수준의 디버깅을 할 수 있습니다.

저는 vi만 계속 써 왔습니다.
Emacs와 gdb를 연결해서 사용하는 것에 대해서는 예전부터 들어 왔는데 참고될 만한 사이트를 좀 말씀해 주시겠습니까?


The Art of Unix Programming의 개략적인 설명을 읽어보세요. 심화학습(?)을 위해 각각의 매뉴얼을 읽어보시면 됩니다.

저는 Visual C++의 키와 동일한 디버깅 키들을 대충 매핑해놓고 사용하는데 참 편리하네요.

=-=-=-=-=-=-=-=-=
http://youlsa.com

cmoh1110의 이미지

printf() ... :oops:

saxboy의 이미지

Quote:
디버깅 노가다에서 조금이나마 해방될 수 있는

노하우를 좀 가르쳐 주세요...

디버깅을 줄일 생각을 하지 마시고, 처음 코드를 작성할때, 한번만 더 생각해서 작성하세요. 버퍼 크기 미리 재보기, 널포인터 미리 체크하기, 리턴타입 체크하기 같은 아주 기본적인 것만 지켜주어도 디버깅할일이 크게 줄어듭니다.

디버깅이 "노가다"라고 느껴지신다면 아마 작성하시는 코드가 좀 더 strict 해질 필요가 있는 것은 아닐까 생각됩니다. 디버깅보다는 디버깅을 줄이기 위한 코드작성이 "노가다"인 경우가 많습니다.
코드를 한줄 만들면 이 코드의 run path는 순식간에 수십가지로 늘어납니다. 이 가능성을 최대한 줄여주시는 것이 좋겠지요. 혹시 C++이나 java에서 exception, try-catch 라는 개념이 왜 편리한지 언뜻 떠오르시지 않는다면 작성하시는 C, C++코드에서 리턴타입을 항상 제대로 체크했었는지 반성해보세요.

좀 오버이지만 간단한 코드를 몇줄 적어보지요. 왜 일부러 큰 의미가 없는 코드를 이곳에 적었는지는 한번 보고 생각해보시면 어떨까요.

#include <stdio.h>
int main(int argc, char **argv)
{
    int ret=0;
    char *ptr=NULL; 
    const char *str="Hello, world\n"; 
     
    if ( argc !=1 ) 
    {
         error1(); 
    }

    ptr = strdup(str); 
    if ( ptr==NULL)
        error2(); 

    ret = printf("%s", ptr ); 
    if ( ret < 0 )
        error3(); 

    if ( ptr!=NULL)
        free(ptr); 

    return 1; 
}

디버깅툴이라고 대단한 것이 있는 것은 아닙니다. 웬만한 오픈소스 프로그램들은 뜯어보면 대부분 #ifdef DBG 류의 라인이 있다는 것은 초절정고수(?)들도 결국은 printf를 가장 믿는다는 것을 반증해주지요.

많이 쓰는 툴에는 gdb (or xxgdb, ddd) 로 대표되는 디버거부터 시작해서, 플랫폼마다 약간 이름이 다르지만 ltrace, strace, truss 등의 syscall tracer들, 그리고 yamd, valgrind, memprof, njamd, mpatrol, checker 등등의 메모리 디버거들정도입니다. 프로그램에 따라 lsof나 netstat같은 system maintenance utility 들도 사용할 필요가 가끔 있는 것도 당연하고요.
하지만 지금까지의 경험을 보면 이런 툴을 사용하더라도 결국은 크래시하는 시점의 스택을 보는 정도나 런타임시의 변수값을 읽어내는 용도 이상으로 사용하는 경우는 별로 없지요.

shs0917의 이미지

답변 감사 드립니다....

하나하나 알아간다기 보다는 무엇을 모르는지를 하나하나 찾아내고

있다는 생각이 드네요...^^

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

kihlle의 이미지

리눅스에서 주로 사용되는 gdb, strace, ltrace, ldd 같은 도구들은 한번 적용해보는 것만으로도 전반적인 이해에 상당히 도움이 되구요. 그리고 꼭 디버깅툴이란 타이틀이 없더라도 모든 도구들을 버그잡는데 전반적으로 활용하셔야 합니다. 경우에 따라서는 /proc 내용이라든가 ipcs 같은 명령어가 벌레잡는데 결적적인 역할을 하기도 합니다.

리눅스가 아니라면... 예를 들면, 다른 플랫폼에서는 주로 dbx를 이용하구요. dynix/ptx에는 cdb라는 ... 뭐 gdb랑 전반적으로 사용법은 비슷한 툴들이 있습니다. 플랫폼에 맞는 도구들을 따로 검색하여 사용법을 익히심이 좋을듯 합니다.

학생이신것같은데 랩에서 쓰는 장비가 리눅스가 아닐것같다는 생각이 들어서 사족을 달아봤습니다 :)

ps. 불란서의 어느 영업사원 이야기
예전에 다니던 회사에서, 제가 만든 허접한 패키지를 여러 나라에 팔고 있었는데 프랑스의 영업사원아찌가 골때리는 상황을 strace 해보고 "이걸 이렇게 고치는게 맞지않냐"라는 버그리포팅 메일을 보내왔더군요. 자신의 mdk 리눅스 스크린샷과 함께... 정말 놀랐습니다. :)

homeless

댓글 달기

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