gdb 상에선 제대로 돌아가는데 쉘상에서는 안돌아가는 프로그램.

익명 사용자의 이미지

POSIX 쓰레드로 프로그램을 간단한 걸루 짜봤는데요.
컴파일해서 쉘 상에서 실행을 하면, 모든 쓰레드가 실행되다 말구 중간
에 종료되서 나옵니다. 에러는 전혀 없이요.
그런데, gcc -g 옵션으로 컴파일해서 gdb상에서 돌려보면 잘됩니다. 이
거 어떻게 된 일인지 ㅡㅡ;;;

익명 사용자의 이미지

저두 예전에 쓰레드 프로그램을 개발하면서 GDB를 사용해봤는데
쓰레드에서는 GDB에서 제대로 버그를 잡을수가 없더군요..
물론 제가 GDB를 잘 몰라서 그럴수도 있지만 여러 다른곳에서도 GDB에서
쓰레드 프로그램을 디버깅하는 정보에 대한 자료는 많이 없더군요..

그래서 일일이 printf로 디버깅을 한 적이 있습니다..^^;;

익명 사용자의 이미지

위와같은 현상의 이유는 대부분 pointer 를 잘못 사용할 경우 입니다.
어떤 프로그램 에서 printf() 함수 하나만 써도 잘돌고 또는 돌지않고
하는 경우도 있는데.. 결론은 배열 크기를 사용하는것 보다 작게 잡았거나
아니면 포인터를 잘못 사용한 경우에 일어나는 현상 입니다.
한번 포인터 사용한 부분 또는 배열 사용한 부분을 유심히 살펴 보세요..

익명 사용자의 이미지

죄송하게도, 잘이해가 되지 않습니다. 왜 그런지 이유를 알 수 있을런지
요. 그리고, 포인터나 배열 사용에 이상이 있음이 발견되지는 않았습니
다. (물론, 디버거로 일일이 체크하지는 못했으니 확언은 못하겠지만, 방3
개 이상의 배열, 이중 포인터의 사용등은 없기 때문에 그 부분은 아니라
고 말씀 드릴 수 있습니다. 더우기 동적메모리 할당을 이용한 경우도 1번
밖에 없거든요.)

익명 사용자의 이미지

gdb상에선 제가 의도한대로 버그없이 프로그램이 실행되는 반면,
쉘 상에선 쓰레드들이 중간에 정상종료되어 버립니다.

익명 사용자의 이미지

포인터에 문제가 없다면 혹시 쓰레드간에 공유되는 데이타를 사용하신다
면 동기화 문제 때문이 아닌지 모르겠군요..저두 예전에 전역 데이타 동기
화를 잘못해서 프로그램이 중간에 다운되는 현상이 있었는데....

익명 사용자의 이미지

원종복님 말씀데로 공유 변수에서 문제가 발생 할 수 있겠군요.
쓰레드 프로그램 에서 가장 조심해야할 부분이 변수의 값을 변경 할때
lock 을 걸어서 다른 쓰레드가 접근 하지 못하게 한다음 변경후 풀어줘야
한다는것 입니다.
그게 아니면 아까도 예기 했듯이 포인터일 가능성이 제일 큽니다.

익명 사용자의 이미지

공유변수에도 문제가 생긴다면 과연 gdb상에서도 프로그램이 '의도대로'
정상적으로 진행이 가능한지요? 답변해주시는 님들께 고맙지만 잘이해가
되지 않는군요 T_T;;
제 의도대로 공유변수는 각자의 쓰레드간에 잘나눠서 침범하지 않고 사용
하더군요. gdb상에선 공유변수에 대한 처리가 실 코드상에서 제대로 되어
있지 않더라도 따로 이루어지는 것인지? 그리고, 쉘 상에서 정상종료되는
부분은 공유변수에 접근도 하기도 전이기에 더 답답해집니다 =_=;;

자세하게 더 덧붙이자면 mutex로 lock을 걸어 사용합니다. 이런 경우엔
세마포어를 사용했을 경우에 비하자면 공유변수에 의한 문제는 거의 발생
하지 않지 않나요.

익명 사용자의 이미지

제 생각으로는 일단 프로그램이 제대로 실행이 되지 않는다는것은 프로그
램에 문제가 있다는 것인데 그것이 GDB에서 제대로 잡히지 않는것 같습니
다. 이전에도 얘기 했듯이 쓰레드 프로그램을 GDB로 디버깅하기란 상당히
까다롭고 실질적으로 버그가 일어난 위치를 제대로 잡아 내지를 못하는것
같습니다..실례로 예전에 쓰레드 프로그램에서 포인터를 잘못 사용하여 수
행도중 다운이 되서 GDB로 확인를 해봤더니 엉뚱한 함수를 가르치고 있더
군요..제생각에는 소스를 하나하나 첨부터 찾아보시는것이 좋을듯 합니
다..

그럼...

익명 사용자의 이미지

제 경험 으로는 debuger 를 사용하여 프로그램을 돌리는 경우와 실제
쉘 에서 돌리는 경우 다른 결과가 올 수 있더군요.
특히 포인터 관련 에러인 경우
각 변수가 메모리에 적재되는 위치가 달라지거든요.
디버거로 확인 하기 곤란한 경우는 printf() 함수로 디버깅 하시는
방법이 제일 고전적이고 확실 합니다.
실제 소스코드를 보면 문제가 쉽게 풀릴 수도 있지 않을까요 ?

익명 사용자의 이미지

답변해주신 두 분께 감사드리구요. 다시 한번 잘연구해봐야겠네요^_^;
역시, gdb도 완벽할 수는 없나보군요.

댓글 달기

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