Дійшов вчора до тестового запуску спайдера. Взяв кілька новинних ресурсів і запустився. В якийсь момент процес вилітає. Справа звична: вмикаю debug output, запускаюсь знову і втикаю в журнал. Знову вилітає, але з логу зрозуміти що саме сталось не получається. Ок, додаю ще кілька printf'ів біля потенційного місця вильоту, ледь не через рядок коду по одному. Знову запускаюсь. Кукіш з маслом. Починаю думати.
В мене make збирає одразу дві версії модуля - нормальний elf та bytecode-версію з дебажними символами для використання в ocamldebug. Додаю ще принтфів та запускаю дебагер. В якийсь момент дебагер каже, що зв'язок з програмою втрачено. Ось так просто: була собі програма, а тут раз, і загубилась. Знімок стеку показує приблизно місце, де загубилась програма: module Unix char 4711. Знаходжу це місце в unix.ml: нормальний шмат коду, що викликає single_write, та при деяких умовах викидає виключення Invalid_argument. Але це виключення в мене перехоплюється. Я заплакав і пішов спати.
В якийсь момент в голову приходить світла думка: зібрати з дебагом бінарь і згодувати його gdb. Перший-же прогін дає результат: процес закінчився, отримавши в голову SIGPIPE'ом. Яка ганьба! По-перше - мені, бо це взагалі штатна ситуація: при масових закачках з connection reuse майже завжди виникає ситуація, коли сервер таки з'єднання закриває, а клієнт в це з'єднання ще щось намагається записати. По-друге - авторам ocamldelbug: соромно не повідомляти користувача про приліт сигналів в UNIX-середовищі.


