Вчера с прикольным багом столкнулся. Маленький веб-сервис, принимает запросы, отвечает JSON'ом. Посылаю запрос - отвечает, все хорошо. Посылаю еще раз - еще раз тот же ответ. Так несколько раз успешно, потом бац - при том же запросе вдруг Access Violation. Потом на тот же запрос опять успешно отвечает все тот же ответ. Т.е. при одних и тех же данных то работает, то не работает. Заметил, что чем больше обрабатывается данных, тем чаще не работает. Отладчик в поиске причины оказался не очень полезен: ну да, где-то в RTTI данных (которые автоматически генерятся компилятором) внезапно оказывается неожиданный null, и рантайм на него натыкается, но почему там null? Пришлось применить Метод Божественного Озарения™. Оказалось, я недавно перевел свои робингудские хэш-таблицы на использование библиотечного std.container.Array, который данные вне GC-кучи хранит и сам менеджит. А в нем оказался баг: при определенных условиях он забывал оповестить GC об имеющихся в массиве указателях, GC приходил и собирал те объекты, указатели в массиве оказывались протухшими. Главное в применении такого метода отладки - отойти подальше от монитора и клавиатуры.
Page Summary
Style Credit
- Style: Neutral Good for Practicality by
Expand Cut Tags
No cut tags
no subject
Date: 2014-10-21 07:36 am (UTC)no subject
Date: 2014-10-21 08:02 am (UTC)no subject
Date: 2014-10-21 01:23 pm (UTC)no subject
Date: 2014-10-21 02:39 pm (UTC)https://bitbucket.org/infognition/robinhood/commits/all
И да, баги запостил куда следует.
https://issues.dlang.org/show_bug.cgi?id=13642
https://issues.dlang.org/show_bug.cgi?id=13619