====== Грабли и клешни связанные с удалённой отладкой ======
Тут недавно задачку подкинули, написать читалку логов другой программы. Ну на код ушло времени в принципе не много, а вот отловить баги оказалось задачей той ещё. Святые угодники, ну как так.
Запускаю программу, она следит за сервисом с GSM модемами, если какая беда, то должна выключить сервис и сказать администратору что кирдыкнулся сервис потому-что. Первый косяк с которым столкнулся это был ifstream, он на блокированном файле тупо падал и грохал приложение. Ну что-же не долго думая переписал приложение на чистенький родименький WINAPI и тут началось нечто. Программа падает, хоть ты её удави. На клиентский сервак нечего лишнего ставить нельзя, ну типо студию залепить, и [[https://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx|Visual-Studio Remote Debug Tools.exe]] тоже поставить не получиться во первых закрыт порт, во вторых ну не по феншую это. Пришлось методом тыка тыкать. В конце концов уже на моменте епанутой истерии нахожу забавную тулзу от SysInternals называется [[https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx|ProcDump v8.2]]. Ну что-же тулза консольная, качаем, смотрим ключики. Есть пару интересных аргументов - -e дампить память только на захваченном exception и ключик -w ждать процесса с определённым именем.
Запускаем : procdump.exe -e -w "logworker.exe"
После запускаем сервис, шаманим наше приложение пока не упадёт. И получаем на выходе вот такой вот полезный файлчик а-ля "logworker.exe_161219_141739.dmp". Даблкликаем на него студией, и что мы видим.
{{works:programmer:cpp:debug-from-dump-image1.png}}
После тыкаем Debug Symbols Path, там выбираем базовые и наши.
И запускаем режим отладки.
Снизу слева будет у нас CallStack, Watches, Locals и Autos. Где у нас параметры переданные функции и всё окружение на момент смерти нашей программы.
И тут я готов был разебать C++ ко всем чертям, эта свинья падала нк конверсии BYTE* в wstring потому что в логе был ебанный символ 0x08 (BELL)
wstring_convert> converter; // file BYTE* line => wstring
wsline = converter.from_bytes(lines);
Кто-бы мог подумать ёпрст!
Вообщем хорошо что хорошо кончается. Баг нашелся и исправился.