데드락 걸렸을때, 동적 라이브러리 함수 추적을 어떻게 할수 있을까요?

bily의 이미지

안녕하세요.

스레드 프로그래밍을 하는데, glibc의 pthread_mutex_lock.c 자체를 직접 바꿔서 테스트를 해보려 합니다.

app 프로그램은 스레드가 여러개 돌면서, 락을 사용하는 것들이고 그래서 경쟁이 있습니다.

pthread_mutex_lock.c 의 파일 자체를 좀 바꿨더니, 한스레드가 락을 먹고는 unlock 이 되지 않고, 다른 스레드들은

그냥 cond_wait에서 자고 있습니다.

..

원래의 pthread_mutex_lock() 라이브러리 함수 안에 제가 이것저것 다른 함수를 넣었었고,

어디선가 락을 반환하지 않고 죽는가 해서 추적을 하려고 하는데, 제가 만든 함수 중에 어디까지 가서 죽은지를 못찾겠네요.

ltrace나 gdb 를 다 사용해 봤는데, 어디서 죽은지를 모르니, 브레이크 포인트를 어디로 둬야 할지도 모르겠고,

ltrace도 끝나지 않아서, 결국 ctrl+c 로 나오는 수 밖에 없네요. gdb로 따라가도, pthread_mutex_lock까지는 나오는데, 그 함수 안에서

다른 곳으로 분기하는 곳(예를 들어 제가 pthread_mutex_lock.c 라이브러리 파일 안에 삽입한 a(), b() )은 찾을수가 없네요.

분명히 디버깅을 위해 printf를 보면, 제가 삽입한 다른 코드로 가서 죽은것데 말이죠.

차라리, 메모리 관련 실수거나, segmentation falut면 그나마 낫겠는데, 락을 원래대로 돌려 놔야하는 알고리즘 어딘가가

문제가 된거라, 어디가 문제인지 찾기가 어렵네요.

고수님의 조언을 부탁드립니다.

sunyzero의 이미지

데드락 오류가 있을 경우에는 뮤텍스 초기화시, 에러체크가 가능한 뮤텍스로 초기화하면 됩니다.
그리고 에러체크가 모두 끝나고 제대로 작동한다면 다시 노멀 뮤텍스로 바꾸시면 됩니다.

pthread_mutex_t p_mutex;
pthread_mutexattr_t p_mutexattr;
 
/* 편의상 pthread_* 함수의 리턴값에 대한 에러 처리는 모두 생략했습니다 */
pthread_mutexattr_init(&p_mutexattr);
pthread_mutexattr_settype(&p_mutexattr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_init(&p_mutex, (const pthread_mutex_t *) &p_mutexattr);

========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.

========================================
* The truth will set you free.

댓글 달기

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