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 

Наше приложение имеет обработчик сигналов. То, что я сделал, это игнорировать SIGPIPE, используя signal(SIGPIPE, SIG_IGN), думая, что мое приложение будет продолжаться, даже если я получу этот сигнал. Но теперь я понимаю, что это не сработает, это просто существует, если я продолжу работу после получения SIGPIPE.

Я не знаю, как отладить эту проблему. Этот сигнал не вызван вызовом сокета непосредственно нашим приложением. Это происходит из libICE. Я прав? Пожалуйста, дайте несколько советов о том, как отладить это.

благодарит заранее.

+1

Когда само приложение 'raise()' es сигнализирует, вы должны уловить это в отладчике. – PlasmaHH

+0

@PlasmaHH: кто сказал что-нибудь о 'raise()'? – SamB

ответ

1

Сигнал поступает из ядра и является результатом write(2) Ввод дескриптора файла, для которого ресивер либо умер, либо выполнил команду shutdown(2).

Похоже, что что-то в вашем коде прикручивает дескриптор файла, который принадлежит libICE.so, а не вам.

Возможно, ваш первый шаг должен состоять в том, чтобы запустить приложение под номером strace, а затем проанализировать журнал, чтобы узнать, как FD, на котором записывается libICE, был прикручен.

Как только вы знаете, что происходит, используйте команду GDB catch syscall, чтобы узнать , где это происходит.