ads

Showing posts with label работа. Show all posts
Showing posts with label работа. Show all posts

Tuesday, April 23, 2013

Рабочее

Понравился сегодня вид переговорной комнаты.


Приятное освещение.

p/s Да, к ноутбуку подключены две мышки и две клавиатуры.

Friday, February 22, 2013

История одного дебаггинга

"Раньше я жалел, что не стал конструктором самолетов... теперь я этому безмерно рад."

Началось это месяц назад. На центральном объекте в городе Б во время сбора очередного генерального месячного отчета по всей этой энергетической бухгалтерии стряслась беда. Обновленные как нельзя кстати алгоритмы расчетов и структура БД, не до конца протестированные на нагрузке, привели к парализации работы бутылочного горлышка системы -- сервера приложений, моей руки творения. Сервер просто падал в хлам, с хрестоматийной accsess violation, жирно и непредсказуемо. Нужно было срочно спасать ситуацию.

Первым делом увеличили детализацию логов. Но по ним ни черта нельзя было понять -- каждый раз привет наступал в новом месте, размер журнала составлял несколько десятков мегабайт, в нем были записи о сотне обрабатываемых клиентских сессиях и нескольких тысячах команд (и какого же количества тридов). В общем, нужен был дебаггер.

Система в городе Б установлена по всем правилам конспирологической паранойи. На машину с сервером я попадал через VPN и два RDP, и кроме этого канала ничего не было. При просьбе скачать кое-чего на машину из Интернета админы только нервно отсмеивались.


А как я запущу микрософтовский дебаггер на машине без Студии? Даже дебагнутая версия сервера не может стартовать на другой машине из-за хитро-линкуемых отладочных динамических библиотек. Некоторое время ушло на то, чтобы собрать дебаг-версию, слинкованную со статическими библиотеками. Это был отдельный квест, и микрософту отдельный за него поклон. Снаряженная масса сервера получилась 50 Мб. Кое-как удалось запустить его, но дамп, выдаваемый Dr. Watson, оказался насколько ужасен и громаден (а я сижу через два RDP, мне даже курсор мышки сдвинуть сложно, не то что дамп анализировать), что было принято решение запускать сервер под более вменяемым gdb.

Для этого срочно было все перекомпилировано с помощью MinGW'шного gcc 4.7.2. И новые 50 мегабайт сервера опять были скопированы в Б. И тут случилась великолепная шутка: запущенный под дебаггером сервер падал на инициализации ODBC драйверов. Без дебаггера отрабатывал нормально, а с ним -- падал. Причем падал сам gdb, что вообще нонсенс. Ясное дело, что проблема не в сервере, а в кривом отладчике. Танцы с бубном не помогли: и скачивание последней версии gdb, и запуск всей этой машинерии с gdbserver, и установка cygwin вместо MinGW с последующей пересборкой всего и заменой gdb, -- все это прошло впустую. Пришлось отказаться от gdb.

Сервер был собран обратно студийным компилятором и в дело был пущен дебаггер cdb. Да, от него пользы стало побольше. Наконец-то удалось увидеть номер трида, на котором обрывалась жизнь сервера, и последний callstack. А дальше начался мучительный поиск багов. Таких, за которые я бы руки отрубал... если б не сам был бы автором.


Через дня три-четыре стало ясно, что пробема в Питоне. Python 2.6 используется на сервере для выполнения скриптовых команд, которые являются обертками для алгоритмов, обслуживающих всяческие бизнес-процессы той системы, ради которой все это и затеяно.

Основные места боевых падений были связаны со встроенными С++ классами, выведенными в питоновское окружение. Тот же класс zerodbc в меру специфический и учитывает некоторые особенности системы, что в свое время исключило использование более вменяемого pyodbc.

Главная беда была в том, чтобы найти все места, где питоновская GIL отпускалась или хваталась раньше времени, что в одних случаях приводило к непредвиденным утечкам памяти, а в других -- к дедлокам. Раньше нагрузка на сервер была меньше, и таких ситуаций встречалось тоже мало. Фу, как непрофессионально. Я чувствовал себя студентом-первокурсником, исправляющим примитивнейшие опечатки в коде.

На определенном этапе ко мне присоединился Дима, коллега и друг из города Б, и с увлечением стал следить за моими потугами. Мы переписывались через джаббер и постоянно материли меня, кто во что горазд. О да, я заслужил такой порки =)
Почти все ошибки удалось найти и обезвредить. Уничтожая каждый новый баг мы приговаривали: "Как оно до этого работало?!" Многопоточное сложное приложение выполняется по принципу Мерфи: если какая-то невероятная ерунда может случиться, то она непременно произойдет. Это главное правило. Но несмотря на наши успехи, одна ошибка оставалась.

Обычный диалог был примерно следующего содержания:

nickela: ну это уже какой-то пиздец... access violation в SaveThread???
teal: да
nickela: ассемблерный дамп посмотри

В один из дней уже часов в одиннадцать вечера я решил расставить дополнительную проверку и блокировки, а также снабдить исчерпывающими логами потенциальные мемори-лико-генераторы. Дима подключился через скайп и выдал умопомрачительную по своей силе идею спрятать обработчики исключений OTL под скоуп питоновского GIL, чтобы исключить потенциальную проблему, что эксепшин в драйвере базы данных будет испорчен. Я с ним согласился и начал править код. К двум часам ночи все было готово, если б не одна досадная опечатка. В итоге весь следующий день мы ловили Fatal Python error: PyEval_SaveThread: NULL tstate. Так как последнюю правку кода я производил уже в полубредовом состоянии, то мало того, что не помнил толком, что менял, так еще и забыл сделать коммит в версионной системе. Поэтому день прошел очень весело. Ближе к концу рабочего дня мы были уже в истерике:

nickela: что-ты поправил этой ночью? признавайся!!!

Но в итоге ошибочка нашлась, чтоб ей пусто было. Это было непередаваемое облегчение -- увидеть как сервер падает на старой доброй, уже такой родной ошибке, а не на этой новой =)

В конечном итоге, перебрав все мыслимые и немыслимые сценарии, мы не пришли ни к чему. Сегодня меня случайно осенило: падение происходит потому, что в момент выполнения команды из-под нее вызывается другая команда (все это в питоне), но перед этим успевает отключиться клиент. Вместе с удаляемой клиентской сессией уходит и враппер интерпретатора,  утаскивая за собой дикт сессии. В этот момент конструируется вторая команда, которая добавляет в дикт своего местного интерпретатора дикт сессии, которую она имеет по простому, не интеллектуальному указателю. В момент разыменования указателя случается бадабум.

Это многоходовка, но предусмотреть такую фигню с самого начала было очень сложно. Исправил, скопировал новую версию сервера и запустил. Работает. На этом можно наконец-то уйти на выходные. Сейчас смотрю на этот месяц, практически круглосуточный дебаг, аж страшно становится. Периодически посматриваю на watchdog -- все работает нормально. Аж не верится. Пожалуй, выпью-ка я сегодня коньячку =)

Friday, March 2, 2012

Ровно год назад, 2 марта, мы с сербами поржали над ребятами из МРСК. Последние спрашивали через меня цель визита сербов, а сербы отвечали, что это они же их и позвали. В этом году, в этот же самый день маразм повторился. Сегодня из МРСК сообщили, что они с сербами будут проездом в Протвино. Что типа нужно бы собраться всем вместе. Сербам же было сказано, что они едут сразу в Смоленск. МРСК сведет меня с ума. Выучили бы уже английский, что ли, чтобы хотя бы понимать друг друга.

Thursday, September 29, 2011

Dungeon Digital Maps

Working on huge web project of the drawer for single-line schemes and PLC-diagrams I implemented one small application upon it. DDM is used to draw any 2D grid-based maps with any background images, to put there units with variable properties, move/create/delete these units, so DDM is a good help to any D&D master, for example.

Soon, as I suppose, we will test it while playing regular D&D module. And now it's time to draw more another images for units and a couple of dungeon maps. Maybe later I'll try to create multi-player version with fog of war, action rights etc.


Created using svg+js on client-side and nodejs on server-side.
Yes, I like JavaScript =)

UPD. 3 oct 2011.
Has created a fully functional stand-alone single-user version, available at:
https://sites.google.com/site/tealyatina/share/ddm.zip
Free to use and modify (uses some GPL libs).

Friday, July 29, 2011

C++ vs JavaScript

Напоминает фильм про Шаолинь. Там три чувака были, один учился прыгать высоко. Ему присязали чугуные болванки к ногам, и он с ними прыгал. Ну, поначалу даже ходить не мог, а через какое-то время сигал с ними аки козел. Ну вот ему учитель приказал снять их и говорит: «давай прыгай ко мне». А сам на втором этаже сидит. Ну тот и прыгнул, и допрыгнул =)
Ну вот js после C++ — это примерно как снять колодки эти и продолжать прыгать на те же 30 см. Даже не задумываешься и не напрягаешься, оно само прыгается, только смотришь на это все со стороны и хренеешь =)

Wednesday, March 2, 2011

Весна, маразм крепчает.

Anton Natarov: Hey Kresa.
It seems that maybe I will come in Belgorod to meet with you during my business trip at 9 March (or nearby).
As I have heard you plan to apply third DMS version upon your visit. What that the plan indeed? BelgorodEnergo have no idea about reason of your coming and they ask me: "Oh, tell us please what Serbian guys will do here" =)

Kresimir Tkalac: They are crazy - they required from us to come

Sunday, February 28, 2010

Starcraft 2 beta

По запросу в гугле "Starcraft 2 beta" в первой строчке наш гудгейм.ру. На второй -- официальный сайт Близзарда =))))) Обоссаться...

Thursday, December 17, 2009

думаю, почему мне все время Буратино вспоминается, когда я с деревом энергообъектов работаю. Все эти РЭС ПЭС ПС... Теперь понял. =)) "Закопай денежки и произнеси РЭКС ПЭКС ФЭКС"

Thursday, September 17, 2009

Проишествие

И на фоне всего этого меня делают начальником большущего отдела с ворохом проектов... надеюсь, текущие задачи программистские останутся в силе.

Thursday, August 6, 2009

Значимость

Всегда говорил родителям (инженеры-строители), что я немного им завидую, потому что видеть дом, который построили по твоим чертежам -- это несравненно большее удовольствие, чем знать, что где-то работает незаметно моя программа, хоть она и обслуживает несколько сотен тысяч человек. Ну, скоро счет пойдет на миллионы уже, хоть какая-то отрада =)
И как раз по теме происходит случай с моим коллегой, с которым мы вместе разрабатывали одну прогу (взято с http://bash.org.ru/quote/404138):
Внешность, говорите? Захожу в РКЦ, заплатить за коммунальные услуги. Передо мной стоит.… Не то поздний парень, не то ранний мужик – тяжело разобрать. С виду – будто с военной хроники сошел: довольно грубая щетина, загорелое лицо, покрытое потеками пота и мелкой сизой пыли, высокие кирзовые сапоги, бриджи и китель цвета «хаки» с погонами времен Советской Армии, панамка, на плечах – что-то типа армейской РПС и вермахтовской «трапеции», к которой прикреплена типа сумка, из которой торчат топор, лопата, пила, виднеются очертания рубанка. Бриджи и сапоги – щедро присыпаны пылью, опилками и стружкой. Ну кто может так выглядеть – плотник, правда? Подходит к кассе, сует листочки, вдруг кассирша выдает:
- Ой! А у меня машина сломалась!
Мужик, как ни в чем не бывало:
- Альт-С.
Кассирша не въезжает:
- Чего?
- Альт плюс Ы. Контрол плюс Ф5. Ф5 – одной клавишей. Далее. Далее. Вариант по умолчанию. Энтер. Ну вот, а вы говорите «сломалась».
Кассирша, глядя на него огромными глазами , возвращает его квитанции и спрашивает:
- Откуда вы это знаете?
Мужик, устало:
- Я ее писал. Не кладите больше локти на клавиатуру.
Приятно, а =)))