воскресенье, 27 декабря 2009 г.

Сodepad - online компилятор

Иногда хочется по-быстрому что-то проверить, а среда разработки недоступна - c
этой проблемой помогают справляться ресурсы типа http://codepad.org.

Это и online-компилятор, поддерживающий кучу языков, и средство для "командной работы", и источник, на который можно дать ссылку, например, в письме.

В общем - по результату оказалось очень удобно, я теперь к этому ресурсу довольно часто обращаюсь.

Кстати, заодно, это достаточно неплохой способ проверить совместимость создаваемого кода с другими компиляторами ;-)

BTW, я не утверждаю, что это единственный ресурс подобной направленности, отнюдь, просто мне он пока что глянулся больше всего.

суббота, 19 декабря 2009 г.

Обход графа наследования в C++

Наверняка многие во время прохождения собеседования, на тестировании BrainBench или еще где-либо встречались с такой академической задачей, как обход графа наследования. Звучит задача проще: в какой последовательности будут вызываться конструкторы в представленной иерархии, и далее следует листинг...

среда, 16 декабря 2009 г.

x86: Из глубины веков...

"The irony is that the original instruction set was theirs,
and the original motivation was theirs," Mazor said

"...по иронии судьбы этот основополагающий набор инструкций был
не наш, как и исходная постановка задачи.", Стенли Мазор


Ругая Intel за уродливый (с их точки зрения!) набор инструкций, ее противники зачастую даже и не подозревают, что роль компании Intel в становлении x86-набора инструкций более чем скромна. Собственно, "зачастую" - еще слабо сказано. Навряд ли хоть один из спорщиков об этом вообще знает! Но - все по порядку...

суббота, 12 декабря 2009 г.

Windbg для забывчивых

Во время работы по анализу дампа, по крайней мере у меня, довольно часто получается, что я забываю об исходной причине возникновения проблемы :-(
Видимо, специально для таких как я в WinDBG сделали команду .lastevent, которая "освежает память", распечатывая в поток вывода информацию о последнем отладочном событии... ;-)

пятница, 4 декабря 2009 г.

Что такое MinWin и зачем он нужен

MinWin — это понятие, используемое Microsoft для описания ядра и операционной системы, основные компоненты которых начали разрабатываться одновременно с Windows Vista. Данное понятие впервые использовалось в 2003 для описания примерно 95 % компонентов операционной системы (правда, со временем этот процент снизился). Это самый популярный вариант минималистичной модульной сборки компонентов Windows, который изначально планировалось сделать ядром Windows 7.

понедельник, 2 ноября 2009 г.

Чудеса DllMain

Давно известно, что определенные практики разработки (типа использования глобальных объектов/загрузки DLL при своей загрузке и т.д.) способствуют возникновению проблем на этапе инициализации/деинициализации, но тут наткнулся на статью.

четверг, 1 октября 2009 г.

Google С++ style guide

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

пятница, 11 сентября 2009 г.

Windows Installer: Изменение одного или нескольких файлов в инсталляции

Сколько ни видел разных программ - к большинству из них почему-то "таблетки от жадности" прилагаются отдельно, зачастую вместе с нетривиальными инструкциями по применению. Между тем, сделать repack не просто, а очень просто...

вторник, 25 августа 2009 г.

Помощь в выяснении природы DLL

На сайте Microsoft есть очень полезная страничка, которая иногда оказывается полезной - DLL Help Database on microsoft.com

Там можно посмотреть для известных DLL всякую разную полезную информацию типа продукта, в котором она появилась, актуальной версии, списках импорта/экспорта, и так далее...

Можно сразу вызвать поиск запросом (язык en_US):
http://support.microsoft.com/dllhelp/?dlltype=file&l=55&S=1&alpha=


Upd: сервис, оказывается, в феврале 2010 приказал долго жить, а жаль...

четверг, 20 августа 2009 г.

Нетривиальные конструкторы

Вернулся из отпуска, взял свежую версию системы, собрал... После первой же модификации системы получил непонятный баг с недетерминированным поведением системы, которая после старта "падала" раз из трех.
Как это искалось - не суть важно, времени на это ушло немного, но вот результат позабавил...

суббота, 18 июля 2009 г.

Карта языка Си++

Нарыл совершенно волшебную работу - исполненная "под старину" карта языка Си++:



Оригинал вот здесь, там же ссылки на изображение в хорошем качестве.

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

У меня теперь такая над рабочим столом в офисе висит :-)

Вот только программирую я в виду специфики моей нынешней деятельности все меньше и меньше... :-(

четверг, 25 июня 2009 г.

"Локальные" баги, STL-way

На днях поступил очередной bug-report из серии "при установке на мою систему неправильно отображается экран XXXX"....

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

суббота, 20 июня 2009 г.

Триграфы

Недавно отлаживал один алгоритм, делал это "вживую", в частности, используя контрольную печать ;-)
В какой-момент сработал ::OutputDebugStringA("WTF??!"), вот только в отладочный поток вывелось неожидаемое "WTF|"...

пятница, 15 мая 2009 г.

Точки следования

Недавно опять перечитывал "Новые сложные задачи на C++", сокрушаясь о своем уровне знания основного средства заработка...
Наткнувшись на пример с i+++++i, вспомнил про давнишнюю задачу, которую давали на одном из собеседований (слава Богу - не мне, поскольку предмет дискуссии очень гнилой, и услышать хотят явно не про UB).
int i = 10;
i = i + i++;

Типа, нужно порассуждать, чему равно i в результате...

воскресенье, 3 мая 2009 г.

"Магические" числа в отладке проблем с памятью

Когда в процессе отладки появляется сообщение "Unhandled exception at 0x00416d9f in sailor.exe: 0xC0000005: Access violation reading location 0xfeeefeee." разработчики, бывают, начинают нервничать.
Между тем, шестнадцатеричные коды, как минимум, в Debug-версии приложения, собранном MSVC, уже могут кое о чем рассказать...

суббота, 25 апреля 2009 г.

Как работают исключения С++ MSVC 2003/2008

Вот ссылочка на достаточно понятный пост про обработку исключений C++:
How a C++ compiler implements exception handling

Upd: Вот еще парочка очень неплохих вводных статей:
О компиляции /EHsc (часть 1)
О компиляции /EHsc (часть 2)


Upd2: По внутренностям SEH-исключений есть хорошая статья Matt'a Pietrek'a, правда старенькая (1997), с тех пор особо ничего для прикладного программиста не изменилось.

четверг, 16 апреля 2009 г.

Использование псевдорегистров MSVC при отладке приложений

Недавно застал человека за очень творческой работой, он методично унавоживал исходный код строками вида
DWORD nCode = ::GetLastError();
char buf[256];
sprintf("LastError=%lu", nCode);
::OutputDebugStringA(buf);

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

понедельник, 16 марта 2009 г.

cygwin+windows!=unix

Забавно, что перед релизом всегда всплывают какие-то фундаментальные проблемы, видимо, это закон природы...

Сейчас случилось "страшное" - используемая при сборке Navi-Sailor система сборки дошла до своего технологического предела...

воскресенье, 15 марта 2009 г.

"Волшебный" CAB для WinDBG

Частенько оказывается, что дамп памяти, приносимый со стенда на анализ (если не удалось посмотреть проблему "вживую" нуждается в достаточно объемной пост-обработке, чтобы продолжить исследование :-(

Как оказалось, жизнь себе можно существенно облегчить...

вторник, 3 марта 2009 г.

ZLib + iostreams - простое разжатие файлов

На этот раз с использованием Boost:

#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

int main()
{
using namespace std;
ifstream file("hello.z", ios_base::in | ios_base::binary);
filtering_streambuf<input> in;
in.push(zlib_decompressor());
in.push(file);
boost::iostreams::copy(in, cout);
}

воскресенье, 1 марта 2009 г.

Релиз-релиз

Скажу честно, было не до блогов - нервно как-то, но,
так или иначе, для бОльшей части народа все обошлось, потери людей, по крайней мере по нашему департаменту - 25% :-(
Зато организационная структура, похоже, меняется радикально...
Например, директор департамента попал в эти проценты :-/

Тем не менее - планов на релиз никто не отменял, начинается "доводка", какими силами, правда, пока не совсем понятно...