C Ошибка сегментации программирования при опросе () - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть приложение, работающее на Solaris 8 (SunOS 5.8 Generic_108528-27 sun4u sparc SUNW, Sun-Fire-880), и оно работает хорошо в течение нескольких дней, пока недавно не вышло из строя.Был модуль сторожевого таймера, который перезапускал приложение, когда оно падало.Тем не менее, он работает и разбился снова и снова.Изучив дампы ядра, я обнаружил, что он зависал при вызовах системных функций, таких как опрос, запись и отправка.Я проверил содержимое переменных, переданных в функции, и они выглядели хорошо.Я понятия не имею, как решить эту проблему.Кто-нибудь может помочь дать некоторые указания о том, где действовать?Заранее спасибо.

Ниже приведен один из примеров дампа основной памяти в опросе:

bash $ gdb applx applx.core
GDB - свободное программное обеспечение, и вы можете распространять его копии.
при определенных условиях;введите «показать копирование», чтобы увидеть условия.
На GDB нет абсолютно никаких гарантий;для подробной информации введите «показать гарантию».
GDB 4.16 (sparc-sun-solaris2.5), Copyright 1996 Free Software Foundation, Inc ...

предупреждение: exec-файл новее основногофайл.
Ядро сгенерировано с помощью `applx -h '.
Программа завершена с сигналом 11, ошибка сегментации.
Чтение символов из /usr/lib/libsocket.so.1...done.
Чтение символов из /usr/lib/libnsl.so.1...done.
Чтение символов из /usr/lib/libgen.so.1...done.
Чтение символов из / usr / lib/libc.so.1...done.
Чтение символов из /usr/lib/libdl.so.1...done.
Чтение символов из /usr/lib/libmp.so.2 ...done.
Чтение символов из /usr/platform/SUNW,Sun-Fire-880/lib/libc_psr.so.1...done.
# 0 0xff219ec4 в _libc_poll ()
(gdb)bt
# 0 0xff219ec4 в _libc_poll ()
# 1 0xff1cccac в _select ()
# 2 0x1cf08 в цикле () в /home/ian123/applx/src/task.c:1450
#3 0x1e0d4 в state_start (local = 0) в /home/ian123/applx/src/state.c:1047
# 4 0x1a0f4 в main (argc = 537600, argv = 0x83400)
в /home/ian123/applx/src/main.c:578
(gdb) вверх
# 1 0xff1cccac в _select ()
(gdb) вверх
# 2 0x1cf08 в цикле () в /home/ian123/applx/src/task.c:1450
1450 r = select (maxfd, rfdsp, wfdsp, efdsp, tvp);
(gdb)p maxfd
$ 1 = 23
(gdb) p rfdsp
$ 2 = (fd_set *) 0xb8020
(gdb) p wfdsp
$ 3 = (fd_set *) 0x0
(gdb)p efdsp
$ 4 = (fd_set *) 0x0
(gdb) p tvp
$ 5 = (struct timeval *) 0xb81a0
(gdb) p * rfdsp
$ 6 = {fds_bits = {7610424, 0}}
(gdb) p * tvp
$ 7 = {tv_sec = 0, tv_usec = 380002}

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Когда я расследую segfault и не знаю, где это происходит, я использую следующую команду GDB:

x/1i <program_counter>

(Заменитьдля вашей архитектуры ... (барабанная дробь) ... программный счетчик, например: $ eip на x86.Я думаю, что это $ pc или аналогичный в SPARC).

Это показывает ошибочную инструкцию.Оттуда я проверяю регистры, которые содержат адреса памяти.

0 голосов
/ 10 ноября 2010

Если GDB покажет вам исходный код, где произошла ошибка сегментации, это МОЖЕТ быстро привести к пониманию проблемы.

...