2012-02-02 3 views
2

상당히 큰 Qt-3 응용 프로그램을 디버깅하고 있습니다. 응용 프로그램은 많은 사전 처리를 수행 한 다음 SIGPIPE 신호를받습니다. 나는 SIGPIPE를 얻 자마자 백 트레이스의 몇 가지 항목을 적어두고 있습니다.타사 라이브러리에서 SIGPIPE 신호 디버깅

#0 .. __write_nocancel() from libpthread.so 
#1 .. _IceTransFreeConnInfo() from libICE.so.6 
#2 .. _IceWrite() from libICE.so.6 
#3 .. _IceFlush() from libICE.so.6 

우리의 응용 프로그램에는 신호 처리기가 있습니다. 내가 한 것은 signal(SIGPIPE, SIG_IGN)을 사용하여 SIGPIPE를 무시하고,이 신호를 받더라도 내 앱이 계속 될 것이라고 생각했습니다. 하지만 지금은 그렇게 작동하지 않을 것이라는 것을 깨달았습니다. SIGPIPE를받은 후에도 계속 존재할뿐입니다.

이 문제를 디버깅하는 방법에 대해 나는 단서가 없습니다. 이 신호는 앱에서 직접 소켓 호출을 통해 생성 된 신호가 아닙니다. 그것은 libICE에서오고 있습니다. 나 맞아? 이것을 디버깅하는 방법에 대한 힌트를주십시오.

미리 감사드립니다.

+1

응용 프로그램 자체에서 신호를'raise() '할 때 디버거에서 그 신호를 잡을 수 있어야합니다. – PlasmaHH

+0

@PlasmaHH :'raise()'에 대해 누가 말 했나요? – SamB

답변

1

신호가 커널에서 들어오는 중이고 수신자가 사망했거나 shutdown(2)을 실행 한 파일 설명 자의 결과는 write(2)입니다.

코드에있는 내용이 사용자가 아닌 libICE.so에 속한 파일 설명자를 망친 것처럼 들립니다.

첫 번째 단계는 strace에서 응용 프로그램을 실행 한 다음 로그를 분석하여 libICE이 쓰는 FD가 정확히 어떻게 엉망인지 확인하는 것입니다.

무슨 일이 일어 났는지 알았 으면 명령을 사용하여 을 찾습니다. 여기에서이 발생합니다.

관련 문제