URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9214
[ Назад ]

Исходное сообщение
"Трабля"

Отправлено nikto , 05-Авг-11 20:09 
Шлялся сегфолт по функциям, до белого каления довел, перелопатил все рядом располагающиеся функции.

3агнал таки падлюку сежду между двумя псевдо-отладочными вызовами write():
в исходниках сразу за write(100300, "1", 1) идет write(100400, "1", 1).

Кто-то может подсказать в чем трабла ???


вывод через strace:
"
...
getpid()                                = 4049
chdir("/home/bla-bla")                     = 0
stat64("bla-bla/lock", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
write(100300, "1", 1)  
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
"

вывод через gdb:
"
Program received signal SIGSEGV, Segmentation fault.
0x4e3be25a in ?? ()
(gdb) backtrace
#0  0x4e3be25a in ?? ()
#1  0x400f1273 in write () from /lib/libc.so.6
#2  0x00000009 in ?? ()
#3  0xbffffe11 in ?? ()
#4  0x0804a986 in prep_main (ssn=0x8054a00) at lalala.c:800
#5  0x0804aa96 in main () at lalala.c:827
"


Содержание

Сообщения в этом обсуждении
"Трабля"
Отправлено ACCA , 05-Авг-11 21:44 
> Шлялся сегфолт по функциям, до белого каления довел, перелопатил все рядом располагающиеся
> функции.
> 3агнал таки падлюку сежду между двумя псевдо-отладочными вызовами write():
> в исходниках сразу за write(100300, "1", 1) идет write(100400, "1", 1).
> Кто-то может подсказать в чем трабла ???

Кто такие 100300 и 100400? Что у тебя в /proc/sys/fs/file-max ?
А вообще похоже на то, что ты запахал file descriptor table к моменту вызова write.


"Трабля"
Отправлено nikto , 05-Авг-11 22:10 
> Кто такие 100300 и 100400? Что у тебя в /proc/sys/fs/file-max ?
> А вообще похоже на то, что ты запахал file descriptor table к
> моменту вызова write.

Призрачные дескрипторы:
>write(100300, "1", 1) = -1 EBADF (Bad file descriptor)

Eсли заменить вызов write() на read(), с заменой соответствующих параметров, картина не меняется.

Заработало:
в итоге переупорядочил и развернул тело функции prep_main и две ее локальные переменные типа int, char* сделал глобальными.

Похоже гороскоп для этой версий libc при старом расположении планет, переменных и функций был составлен не верно.
Хотя на других линях и фряхах все пучком было.


"Трабля"
Отправлено Вова , 06-Авг-11 18:54 
>> Шлялся сегфолт по функциям, до белого каления довел, перелопатил все рядом располагающиеся
>> функции.
>> 3агнал таки падлюку сежду между двумя псевдо-отладочными вызовами write():
>> в исходниках сразу за write(100300, "1", 1) идет write(100400, "1", 1).
>> Кто-то может подсказать в чем трабла ???
> Кто такие 100300 и 100400? Что у тебя в /proc/sys/fs/file-max ?
> А вообще похоже на то, что ты запахал file descriptor table к
> моменту вызова write.

Написано же -он так отладку осуществил, думая смотреть стрейсом. Есть код, который падает, он придумал обрамить его данными write в несуществующие дескрипторы. А упало именно в этих вызовах write! И так как упало именно в этих write(), то смыслом и пользой добавления данных вызовов является вытеснение вконтакта и прочих порноресурсов из рабочего времени разработчика. Когда думаешь о работе, часто приходят полезные сопутствующие мысли, которые вполне могут решить поставленную задачу. Как мы видим ниже из признания автора, так и произошло в данном случае.