Попробуйте использовать инструмент, который отслеживает системные вызовы, например, strace
в Linux или tusc
в HP-UX. Когда возникла тупиковая ситуация, вы должны увидеть зависание процесса в вызове блокировки. Это не является положительным доказательством. Это может быть обычный блок. Затем вам нужно определить, может ли блок быть разрешен когда-то или нет. Это требует знания ресурса, которого ожидает процесс.
Пример
На RHEL4 существует ... особенность ..., которая может привести к тупику ctime
. Найдите пример программы, демонстрирующей это поведение ниже:
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
volatile char *r;
void handler(int sig)
{
time_t t;
time(&t);
r = ctime(&t);
}
int main()
{
struct itimerval it;
struct sigaction sa;
time_t t;
int counter = 0;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sigaction(SIGALRM, &sa, NULL);
it.it_value.tv_sec = 0;
it.it_value.tv_usec = 1000;
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 1000;
setitimer(ITIMER_REAL, &it, NULL);
while(1) {
counter++;
time(&t);
r = ctime(&t);
printf("Loop %d\n",counter);
}
return 0;
}
Как правило, после пары тысяч итераций он заходит в тупик. Теперь прикрепите strace
вот так
strace -s4096 -p<PID>
где PID
- идентификатор процесса программы. Вы увидите зависание программы при вызове с FUTEX_WAIT
в параметрах. (Я не могу процитировать всю строку, так как в настоящее время у меня нет доступа к машине RHEL4, извините, пожалуйста).