프로세스가 현재 무엇을 하고 있는지 명령어를 이용해 알 수 있
글쓴이: msoyu / 작성시간: 수, 2005/04/13 - 5:42오후
안녕하세요?
여러 개의 쓰레드를 사용하는 프로세스가 어느 순간에 동작이 멈추는 것 같습니다. 많은 출력문을 주기적으로 출력 하도록 해 놓았는데 메시지가 하나도 출력되지 않는 것으로 보아 멈춰 있는 듯 합니다. top 을 이용해 살펴보면 sleep으로 표시되고, CPU를 사용하지 않고 있습니다.
디버깅을 해 보려 하지만 쉽지가 않네요.
그래서, 혹시 명령어를 이용하여 프로세스 또는, 각 쓰레드들이 어떤 함수를 수행중인지 알 수 있을까 해서요.
참고로, main 을 포함하여 총 4개의 쓰레드로 구성되어 있습니다.
예를 들어, A, B, C, D 쓰레드가 있으며,
A 쓰레드는, 매 초 sleep 이후에 B, C, D 쓰레드 상태를 감시하고, 만일 종료된 경우 재 수행해 주는 작업을 합니다.
B 쓰레드는, 시스템에서 제공하는 Timer (timer_create) 를 이용하여 주기적인 작업을 수행합니다.
C 쓰레드는 메시지 큐로부터 데이터를 읽어 UDP 를 이용하여 외부 호스트로 전달하고,
D 쓰레드는 외부로부터의 UDP를 수신하여 처리합니다.
시험 환경은, Linux, Tru64 입니다.
도움 부탁 드립니다.
감사합니다.
Forums:
제 경험상 간단하게 각 쓰레드가 주기적으로 어떤 구문에서 printf 를
제 경험상 간단하게 각 쓰레드가 주기적으로 어떤 구문에서 printf 를 해줘서
그것을 잡아내서 분석해 보면 어떤 쓰레드가 죽는지 알수 있겠죠.
^^ be cool ~
http://fromdj.pe.kr
Re: 프로세스가 현재 무엇을 하고 있는지 명령어를 이용해 알 수
gdb 를 프로세스에 attach 하고, 과감히 ctrl+c 하고 bt 를 수행! ;;
strace 도 한번 시도해 보세요. 계속 멈춰있다면 아무 메시지도 안 내겠지만요.
하지만 역시...
죽여도 되는 프로세스면, zoocmic 님 말씀대로 디버깅 메시지를 더 자세히 넣고 다시 수행에 한표를 던집니다.
의견 감사 드립니다.쓰레드들이 죽는 것 같지는 않네요.그러다 보니
의견 감사 드립니다.
쓰레드들이 죽는 것 같지는 않네요.
그러다 보니 디버깅이 더 어려운 것 같습니다.
더 살펴 보아야겠지만,
동일한 환경하에서 시스템 타이머를 하나 사용하는 것과 두 개를 사용하는 것의 차이로 보여지네요.
하나만을 사용했을 때는 멈춤 현상을 보지 못한 것 같은데,
두 개를 사용하게 되면 빠르면 몇 십분, 늦으면 몇 시간 후에 그런 현상이 발생하고 있습니다.
첫번째 타이머는 매 초 주기로 시그널을 받고,
두번째 타이머는 첫번째 타이머에 의해 시그널을 받아 처리할 때 reset을 하는 구조를 하고 있습니다.
좋은 하루 되세요. :)
좋은 하루 되세요.
thread-unsafe 한 함수를 사용한 게 아닌가 확인해보세요.
thread-unsafe 한 함수를 사용한 게 아닌가 확인해보세요.
lsstack을 한번 사용해보심이 좋을듯합니다.구동중인 프로세스의
lsstack을 한번 사용해보심이 좋을듯합니다.
구동중인 프로세스의 스택을 볼 수 있습니다.
가끔은 밥을 굶어도 살 수 있다.
[quote="버그소년"]lsstack을 한번 사용해보심이 좋을듯합니다.
버그소년님이 추천하신 lsstack을 이용하여 프로세스의 스택을 확인함으로써 문제의 원인을 찾을 수 있게 되었습니다. 현재까지 잘 동작하고 있습니다. 고맙습니다.
*문제 - 여러 쓰레드간에 mutex 록이 deadlock 상태로 된 것입니다.
*원인 - Timer 시그널 핸들러에 대한 block 을 설정하지 않음으로 인해 다른 쓰레드들에서 해당 시그널을 공유.처리함에 따라 문제 발생한 것으로 보입니다.
*조치 - 다른 쓰레드들에서는 Timer 시그널을 받지 않도록 block
- Timer 시그널 핸들러 처리 중 시그널 받지 않도록 block
lsstack 참조 : http://sourceforge.net/projects/lsstack
쓰레드와 시그널 참조 : http://www.joinc.co.kr/modules.php?name=News&file=article&sid=142&mode=nested
감사합니다. :o
좋은 하루 되세요.
심심하면 항상 게시판 읽는데 오늘 좋은 글 만났네요lstack
심심하면 항상 게시판 읽는데 오늘 좋은 글 만났네요
lstack
감사합니다 ^^
가자 해외로 ~ .. 돈 벌러.
[quote="kicom95"]심심하면 항상 게시판 읽는데 오늘 좋은 글
asdfasdf
[quote="Anonymous"]thread-unsafe 한 함수를 사
jjjjjkkkkk
gcc -g -o lsstack -Wall -lbfd -liberty l
gcc -g -o lsstack -Wall -lbfd -liberty lsstack.c
/tmp/ccdLvCFs.o(.text+0x141b): In function `get_file_symbols':
/home/speedy/lstack/lsstack.c:685: undefined reference to `bfd_openr'
/tmp/ccdLvCFs.o(.text+0x1432):/home/speedy/lstack/lsstack.c:687: undefined reference to `bfd_get_error'
/tmp/ccdLvCFs.o(.text+0x143b):/home/speedy/lstack/lsstack.c:687: undefined reference to `bfd_errmsg'
/tmp/ccdLvCFs.o(.text+0x148c):/home/speedy/lstack/lsstack.c:693: undefined reference to `bfd_check_format'
/tmp/ccdLvCFs.o(.text+0x1618):/home/speedy/lstack/lsstack.c:732: undefined reference to `bfd_close'
/tmp/ccdLvCFs.o(.text+0x1982): In function `grok_symbols':
/home/speedy/lstack/lsstack.c:843: undefined reference to `bfd_init'
collect2: ld returned 1 exit status
그런데 이런 에러를 만났는데요....
라이브러리도 제대로 링크 해준거 같은데....
구글신도 오늘은 제대로 답을 안해주네요 -_-;;
리눅스 버젼 문제인듯 T.T
가자 해외로 ~ .. 돈 벌러.
[quote="kicom95"]gcc -g -o lsstack -Wall
bfd 가 붙는 것으로 보아 -lbfd 에 있는 함수들 같은데요.
그 플래그를 뒤로 빼줘 보세요.
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
[quote="kicom95"]리눅스 버젼 문제인듯 T.T[/quot
:o 다음에서는 컴파일 됩니다.
[ysw@pmas2 lsstack]$ uname -a
Linux pmas2 2.4.18-4smp #1 SMP Thu Aug 22 17:42:36 KST 2002 i686 unknown
[ysw@pmas2 lsstack]$ gcc --version
2.95.4
[ysw@pmas2 lsstack]$
:? 다음에서는 동일한 컴파일 오류가 발생하네요.
[ysw@ns lsstack]$ uname -a
Linux ns.bnftech.com 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux
[ysw@ns lsstack]$ gcc --version
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[ysw@ns lsstack]$
:?: 그리고, 라이브러리 순서를 바꿔도 동일한 오류가 발생합니다.
좋은 하루 되세요.
[quote="msoyu"] :?: 그리고, 라이브러리 순서를 바꿔도
제가 사용하는 시스템은 Fedora Core3 구요, GCC 버전은 아래와 같습니다.
컴파일 해보니, false 에서 문제가 생겼는데 FALSE 로 고친 다음 다시하니, 아래처럼 에러가 나오네요.
그래서 Makefile 에서 라이브러리 링크 위치를 바꿔 주었더니 잘 됩니다.
nm 으로 확인해보면 undefine 된 함수들이 libbfd.h 에 있는게 맞는데...
조금이나마 도움이 되시길 바랍니다.
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
댓글 달기