воскресенье, 19 ноября 2017 г.

Windbg debugging series, part 3 of n, make_shared vs new

Третья часть, в которой я немного покажу, как восстанавливать информацию об объектах в windbg без приватных символов (только публичные), а также немного поясню почему make_shared лучше чем сырой вызов new, и как вообще это связано с отладкой.

понедельник, 6 ноября 2017 г.

Windbg debugging series, part 2 of n. Stack overflow

Вторая часть, в которой мы обсудим ошибки переполнения стека. В основном, мы будем обсуждать переполнение стека в ядре, т.к. там все более драматично, чем в user-mode. Про user-mode расскажу в конце статьи.

среда, 1 ноября 2017 г.

Windbg debugging series (1 of n)

Лирическое отступление

Давно я ничего не писал в блог, но тут несколько людей так или иначе спрашивали меня про Windbg и про его расширения, поэтому решил попробовать написать серию постов об отладке C/C++ кода в Windows с помощью отладчика Windbg, поделиться своим опытом использования windbg, а также услышать feedback и ваши истории успеха при использовании Windbg

суббота, 7 марта 2015 г.

Пару слов о конференции C++ Russia 27-28 февраля 2015

Вступление

Я посетил конференцию http://meetingcpp.ru/, данная конференция посвящена языку C++ и проводится регулярно в России. Итак, ниже мои впечатления о конференции. Я разделил доклады на несколько основных направлений, хотя на самой конференции такого деления и не проводилось.

четверг, 1 января 2015 г.

Парад планет

В фильме «2012» парад планет 
оказывает негативное влияние на Солнце,
 что приводит к ужасным катаклизмам на нашей планете.
 (выдержка из Wikipedia)

Был на работе недавно довольно эпичный баг. Сформулирован он был примерно следующим образом: после развертывания компоненты FDE (Full disk encryption) Windows загружается но на экране ничего не отображается (черный экран). Разбирательство с этим багом у нас заняло несколько месяцев (естественно, не фулл-тайм), и вот, наконец, мы докопались до сути.

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

пятница, 13 июля 2012 г.

Восхождение на белуху. Первый блин комом.

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

суббота, 21 января 2012 г.

Secure Coding

Наша компания купила курс для программистов C, C++: "Secure Coding in C and C++". Для проведения курса был приглашен преподаватель из Carnegie Mellon University. Я попытаюсь сделать краткий обзор лекций, которые нам были прочитаны. Скажу сразу - это мое субъективное мнение.

воскресенье, 25 декабря 2011 г.

И снова про синтаксические особенности C++

В C++ очень сложный и неоднозначный синтаксис (гораздо сложнее, чем в том же C). На эту тему было написано немало статей, книг. Ниже я приведу несколько особенностей, на которые я натолкнулся недавно, причем, на некоторые я наступаю не в первый раз.

понедельник, 21 ноября 2011 г.

Что же такое type erasure?

В данном случае мне кажется, что проще привести пример, который обрисует проблему. Итак, предположим, нам необходим список, содержащий функции со следующей сигнатурой:
typedef int (* nullary_function_returning_int_t)();
_Winnie C++ Colorizer
Окей, скажем мы:
typedef std::list<nullary_function_returning_int_t> func_list_t;
_Winnie C++ Colorizer
Но, что если мы хотим хранить не только функции, но и объекты у которых есть оператор (), возвращающий int. В таком случае, мы могли бы сделать базовый класс:
class nullary_function_base { public:
 virtual ~nullary_function_base(){}

virtual int operator() () = 0; }; typedef std::list<nullary_function_base * > func_list_ptr_t;
_Winnie C++ Colorizer
Но в таком случае мы ограничены только теми объектами, которые являются наследниками класса nullary_function_base. Как быть с функторами, которые получаются, например, в результате использования std::bind1st и пр.? Ведь в этом случае мы уже не можем сделать его наследником nullary_function_base. Или если используется обобщенное программирование и тип функтора просто неизвестен (например, внутри шаблонного класса, функции)?
Вот как раз для решения такой проблемы и используется type erasure.

вторник, 8 ноября 2011 г.

std::auto_ptr vs boost::scoped_ptr vs std::unique_ptr

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

В данном примере мы рассмотрим три вида smart pointer. Все они предоставляют практические одинаковые возможности по управлению raw pointer. Также мне бы хотелось разобраться почему в новом стандарте C++11 auto_ptr объявлен устаревшим, что нужно использовать вместо него, и какие возможности есть в компиляторах не поддерживающих новый стандарт.

воскресенье, 6 ноября 2011 г.

Простая библиотека для межпроцессного взаимодействия на базе boost.interprocess

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

  • Boost - я использовал версию 1.47.0 (самосборная, на базе gcc-4.4.5)
  • CMake - версия 2.8.2 (из репозитория Debian squeeze)
  • gtest - версия 1.5.0 (из репозитория Debian squeeze)
  • gmoсk - версия 1.4.0 (из репозитория Debian squeeze)
  • QtCreator - версия 2.3.0 (Вручную инсталлированный) - он имеет plugin для поддержки CMake сборки (на самом деле - мой любимый редактор :)).
Итак поехали

суббота, 21 мая 2011 г.

Организация сборки продуктов с помощью CMake

На работе мы используем CMake для сборки продуктов. При этом собираются различные конфигурации  (Release, Debug), с помощью разных компиляторов (msvc-2008, mingw-gcc-4.4.0, sparc-sunos-gcc-3.4.6, прочие компиляторы для различных устройств: iar, arm-gcc, vrxcc).

Примерная иерархия директорий со сборками выглядит так:

\---buildroot
    \---win32
        +---mingw-gcc-4.4.0
        |   +---Debug
        |   \---Release
        \---msvc-2008
            +---Debug_Dynamic
            +---Debug_Static
            +---Release_Dynamic
            \---Release_Static

Для поддержки такой иерархии написаны скрипты для автоматизации конфигурирования и сборки проекта.

четверг, 4 ноября 2010 г.

Динамическая типизация в С++

Если открыть любую книгу по программированию на С++, то почти наверняка найдем высказывание о том, что C++ - язык со статической типизацией. Статическая и динамическая типизация - взаимоисключающие понятия, если есть одно, то не может быть другого. Однако, вспомним, что в C++ есть шаблоны, а также есть шаблонное метапрограммирование (template metaprogramming).

воскресенье, 31 октября 2010 г.

Парсер csv

Недавно мне понадобилось парсить файл формата csv. При этом каждый элемент соответствует некоторому полю структуры, например:
Содержимое файла csv:
some string,1,some string 2,100500
hello, 2,good bye,111111

Структура, которую необходимо заполнить:
struct some_struct
{
    std::string name1;
    int count1;
    std::string name2;
    int count2;
};
_Winnie C++ Colorizer
Используем для этих boost:
Нам понадобятся две библиотеки: tokenizer и lexical_cast

воскресенье, 24 октября 2010 г.

Приемы программирования. Part 1

Язык C
Как писать функции, безопасные с точки зрения утечки ресурсов.
Под ресурсами понимаются открытые файлы, сокеты, хэндлы, выделенная память.

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

среда, 25 августа 2010 г.

За что я люблю C++

Праздник отладки:

В С++ (и в С) есть замечательный оператор: ,
Он возвращает свой последний аргумент.

У меня в коде была такая конструкция:


namespace
{
const unsigned int BuffSize = 15;
}

int parse()
{
const unsigned char buff[BuffSize];
//...
std::string name = std::string(reinterpret_cast<const char *>(buff, BuffSize));
}
_Winnie C++ Colorizer


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

Этот проект собирается под win32 и sparc solaris, под виндой - msvc 2008, под соляркой - gcc 4.2.1. Также для тестов компиляции он собирается под mingw32-g++ 4.4.

В студии проект собирался с /W4, под gcc с -Wall.

Перепробовав все, я решил включить в gcc -Wextra и -pedantic.

Среди кучи варнингов я заметил вот этот: warning: left-hand operand of comma has no effect. Посмотрев в коде я увидел как раз указанную выше конструкцию.

Соответственно, оператор "запятая" возвращал последний операнд.

В гугле по запросу C++ comma operator выдал сразу пояснение:


a = b, c;    // a is set to the value of b!

a = (b, c);  // a is set to the value of c!

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

2005 студия и wince 4.2? Легко!

Так как дома у меня линукс, а винда только на работе, поэтому пишу по памяти, не обессудьте)

Последовательность действий такая:

* Устанавливаем SDK для wince 4.2 для evc 4.0

* создаем проект под 2003 smart device

* в параметра компилятора указываем нужную target machine: ну там ARM4 и пр.

* в параметрах линковщика нужно выбрать QARMT4 или как-то так)

потом если че, в дополнительных параметрах

воскресенье, 9 августа 2009 г.

Первый пост

У меня появился интернет, решил создать блог