metaclass: (Default)
[personal profile] metaclass
"Сначала мы себе создаем проблемы, а потом их героически решаем."

Проявился, значит, в одном из сервисов, призванных работать 24/7, странный баг.
Все работает, никаких исключений, никаких признаков ничего плохого - но данные в базу не попадают. Появляется ну раз в месяц, может быть. Бесил, ибо был необъясним.
Добавил в сервис консоль удаленного управления, через телнет. Запряг весь наш саппорт при таких симптомах ничего не делать, кроме поднимания меня из гроба.
И вот сегодня как раз удачно сошлись звезды: опять баг, саппорт меня саммонил, у клиента нормальный сервак, сервис обновлен, консоль есть, можно спокойно изучать.
Включил консолью всю отладку, сижу втыкаю в DebugView/OutputDebugString, параллельно рассматривая код.
И вижу странное: все работает, кроме функции которая скидывает данные из расчетного кэша в БД. А функция, в целях снижения нагрузки на БД окружена таймером, который разрешает ей работать не чаще чем раз в определенное время, обычно 15 секунд. И, что характерно - реализовано это на GetTickCount, который хоть и склонен к переполнению, но при адекватной реализации это не мешает. А реализация там, ВНЕЗАПНО, неадекватная - два обращения к GetTickCount, вместо одного.
Смотрю значение GetTickCount - 1.25 дня. Смотрю данные - последний раз пришли в 7 часов утра. Туплю. Потом доходит - 7 часов утра ВЧЕРА, т.е. 1.25 дня назад. С приездом вас, называется.

Сервис останавливать нежелательно - надо бы и данные скинуть в базу, а то потом придется делать немного хитроватую процедуру их повторной передачи.
Значит, что я делаю:
1) Достаю строго нужную версию сервиса из SVN.
2) Собираю с отладочной информацией.
3) Копирую файлы отладочной информации клиенту рядом с его работающим сервисом.
4) Ставлю Debugging tools for Windows
5) Подключаюсь к сервису
6) Ставлю bp на нужный метод.
7) Ловлю вызов.
8) Дохожу до реализации if в виде cmp edx, eax / jbe ...
9) Меняю значение регистра edx на правильное, метод идет работать как положено.
10) Profit. Данные скинулись в базу. Переменная установилась в кошерное значение. Еще есть 49 дней до следующего переполнения, можно успеть починить исходники.

Date: 2012-01-04 11:23 am (UTC)
From: [identity profile] hshhhhh.livejournal.com
Шаман :). А в линуксах такое как сделать?

Date: 2012-01-04 11:33 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ну точно так же, наверно.
отладочная информация, gdb, аттач к процессу и далее аналогично :)

Date: 2012-01-04 12:13 pm (UTC)
From: [identity profile] vp.livejournal.com
ты удолбешься там под ГДБ сидеть, я думаю.

Date: 2012-01-04 12:27 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ты не поверишь, но я баги в компиляторе хаскеля под виндой gdb отлаживал :)

Date: 2012-01-04 01:37 pm (UTC)
From: [identity profile] ilya-portnov.livejournal.com
Это уже не гинеколог, это уже проктолог…

Date: 2012-01-06 08:53 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Отлично!

Date: 2012-01-04 01:43 pm (UTC)
From: [identity profile] nicka-startcev.livejournal.com
гдб всреднем, заметно удобнее чем виндбг - меньше дрочки руками, меньше шаманских последовательностей по переподзагрузке символов, чуть лучше с удаленной отладкой.

Date: 2012-01-04 01:48 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Кстати, да, он от входа чуть понятнее.

Date: 2012-01-04 02:04 pm (UTC)
From: [identity profile] tzirechnoy.livejournal.com
В gdb тожэ самое делается явно проще. Ввиду простоты повторов, если промахнулся. Я всякое вытаскивал -- например, списки занятых ресурсов и их размеры из X-сервера, весьма удобно (xrestop чушь всякую показывал).

Кстати, если вдруг нет отладочной информацыи -- то сравнительное удобство командной строки только возрастает. То есть подобную задачу я, скорее всего, решыл бы довольно быстро и без debug symbols.

А вот собрать так, чтобы отладочная информацыя попала -- т.е. как минимум та жэ версия gdb, libgcc и скриптов линкера -- это выглядит фантастикой. Я не пробовал, но выглядит. Так что отладочные символы всегда надо спасать при релизах. И -dbg пакеты в Debian -- отнюдь не блаж, а рабочий инструмент сисадмина.

Date: 2012-01-04 02:27 pm (UTC)
abbra: (Default)
From: [personal profile] abbra
В реальности, если известно, что проблема в твоем коде, а не в системных (и прочих) библиотеках, то собрать ту же версию проще. Со средствами вроде OBS подогнать под конкретную среду вплоть до нужного обновления тоже особой проблемы не представляет.

Date: 2012-01-04 12:49 pm (UTC)
From: [identity profile] nicka-startcev.livejournal.com
gdb вместо виндбг, меньше перезагрузок после установки мутного софта, кошерный ссш вместо дырявого телнета, а в остальном -- ровно так же.

Date: 2012-01-04 12:59 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ни одной перезагрузки, мне ж нужно было сервис запущенным пофиксить :)
Telnet там только к моему сервису и только на 127.0.0.1

а вообще да, gdb

Date: 2012-01-04 01:42 pm (UTC)
From: [identity profile] nicka-startcev.livejournal.com
gdb ввинде довольно странен. Там с форками и тредами есть некоторые неприятные плавающие глюки.

>Ни одной перезагрузки, мне ж нужно было сервис запущенным пофиксить :)

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 7th, 2025 05:59 pm
Powered by Dreamwidth Studios