뮤텍스를 고정하는 나사산을 결정할 수 있는가?
우선, 나는 다중읽기 C 프로그램을 쓰기 위해 pthread 라이브러리를 사용한다.실들은 항상 그들의 기다린 뮤텍스에 달려있다.스트레이스 유틸리티를 사용하여 그 안에 있는 실을 찾을 때FUTEX_WAIT
상태, 그 때 어떤 스레드가 그 뮤텍스를 잡고 있는지 알고 싶다.하지만 내가 어떻게 그것을 할 수 있는지 모르겠어.그렇게 할 수 있는 유틸리티가 있을까?
누가 자바 가상 머신에서 지원하는 기능이라고 해서 Linux에서 지원하는 기능인지 알고 싶다.
뮤텍스 내부 지식을 이용해서 이렇게 할 수 있어.평소에는 별로 좋은 생각이 아니었지만 디버깅을 해도 괜찮다.
최신 glibc인 pthreads의 NPTL 구현을 통해 Linux에서__data.__owner
의 일원.pthread_mutex_t
현재 잠겨 있는 스레드를 찾기 위한 구조공정에 붙여서 하는 방법은 다음과 같다.gdb
:
(gdb) thread 2
[Switching to thread 2 (Thread 0xb6d94b90 (LWP 22026))]#0 0xb771f424 in __kernel_vsyscall ()
(gdb) bt
#0 0xb771f424 in __kernel_vsyscall ()
#1 0xb76fec99 in __lll_lock_wait () from /lib/i686/cmov/libpthread.so.0
#2 0xb76fa0c4 in _L_lock_89 () from /lib/i686/cmov/libpthread.so.0
#3 0xb76f99f2 in pthread_mutex_lock () from /lib/i686/cmov/libpthread.so.0
#4 0x080484a6 in thread (x=0x0) at mutex_owner.c:8
#5 0xb76f84c0 in start_thread () from /lib/i686/cmov/libpthread.so.0
#6 0xb767784e in clone () from /lib/i686/cmov/libc.so.6
(gdb) up 4
#4 0x080484a6 in thread (x=0x0) at mutex_owner.c:8
8 pthread_mutex_lock(&mutex);
(gdb) print mutex.__data.__owner
$1 = 22025
(gdb)
(나는 매달린 실로 전환한다; 역추적을 행하여 그 뒤를 찾아낸다.pthread_mutex_lock()
고정되어 있는 경우, 스택 프레임을 변경하여 잠그려는 뮤텍스의 이름을 찾은 다음, 해당 뮤텍스의 소유자를 인쇄하십시오.LWP ID 22025가 붙은 실이 범인임을 말해준다.
그런 다음 사용할 수 있음thread find 22025
알아내다gdb
스레드에 대한 스레드 번호 및 스레드로 전환하십시오.
나는 그런 시설에 대해 잘 모르기 때문에 나는 네가 그렇게 쉽게 내릴 거라고 생각하지 않아. 그리고 아마 네가 생각하는 것만큼 프로그램을 디버깅하는 데 도움이 되지는 않을 거야.이런 것들을 디버깅하는 데 있어 로그가 바로 여러분의 친구인 것처럼 보일 수도 있다.자신만의 작은 로깅 기능을 수집하기 시작하십시오.그들은 화려할 필요가 없고 디버깅을 하면서 일을 끝내면 된다.
C++는 미안하지만 다음과 같은 것.
void logit(const bool aquired, const char* lockname, const int linenum)
{
pthread_mutex_lock(&log_mutex);
if (! aquired)
logfile << pthread_self() << " tries lock " << lockname << " at " << linenum << endl;
else
logfile << pthread_self() << " has lock " << lockname << " at " << linenum << endl;
pthread_mutex_unlock(&log_mutex);
}
void someTask()
{
logit(false, "some_mutex", __LINE__);
pthread_mutex_lock(&some_mutex);
logit(true, "some_mutex", __LINE__);
// do stuff ...
pthread_mutex_unlock(&some_mutex);
}
로깅은 완벽한 해결책은 아니지만 아무것도 아니다.그것은 보통 당신이 알아야 할 것을 얻는다.
일반적으로 libc/플랫폼 호출은 OS 추상화 계층에 의해 추상화된다.뮤텍스 데드락은 소유자 변수와 pthread_mutex_timedlock을 사용하여 추적할 수 있다.스레드가 잠길 때마다 변수를 자체 tid(gettid()로 업데이트해야 하며 pthread ID 저장용 다른 변수를 가질 수도 있다.) 따라서 다른 스레드가 차단되고 pthread_mutex_timedlock에서 시간 초과되면 소유자 tid와 pthread_id의 값을 인쇄할 수 있다.이렇게 하면 당신은 쉽게 주인 실을 찾을 수 있다.아래에서 코드 조각을 찾으십시오. 모든 오류 조건이 처리되지 않는다는 점에 유의하십시오.
pid_t ownerTid;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
class TimedMutex {
public:
TimedMutex()
{
struct timespec abs_time;
while(1)
{
clock_gettime(CLOCK_MONOTONIC, &abs_time);
abs_time.tv_sec += 10;
if(pthread_mutex_timedlock(&mutex,&abs_time) == ETIMEDOUT)
{
log("Lock held by thread=%d for more than 10 secs",ownerTid);
continue;
}
ownerTid = gettid();
}
}
~TimedMutex()
{
pthread_mutex_unlock(&mutex);
}
};
죽은 자물쇠를 찾는 다른 방법들이 있는데, 아마도 이 링크가 http://yusufonlinux.blogspot.in/2010/11/debugging-core-using-gdb.html에 도움이 될 것이다.
아래 링크를 읽어보십시오. 잠금 소유자를 찾기 위한 일반 솔루션입니다.도서관을 옆으로 잠가도 작동하고 소스코드가 없어도 된다.
https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Deadlocks
참조URL: https://stackoverflow.com/questions/3483094/is-it-possible-to-determine-the-thread-holding-a-mutex
'IT이야기' 카테고리의 다른 글
코틀린에서 자바 정전기법에 해당하는 것은 무엇인가? (0) | 2022.05.16 |
---|---|
Vuex, 루트 게이터에서 이름보다 앞선 모듈 게이터를 사용할 수 없는가? (0) | 2022.05.16 |
GLIBC란 무엇인가?그것은 무엇에 쓰이는가? (0) | 2022.05.16 |
v- 안에서 v-skeleton-loader를 시각적으로 만드는 방법? (0) | 2022.05.16 |
Spring의 JDB로 IN() SQL 쿼리를 실행하는 방법CTEMplate 효과적? (0) | 2022.05.16 |