Третья часть, в которой я немного покажу, как восстанавливать информацию об объектах в windbg без приватных символов (только публичные), а также немного поясню почему make_shared лучше чем сырой вызов new, и как вообще это связано с отладкой.
воскресенье, 19 ноября 2017 г.
понедельник, 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
Ярлыки:
программирование,
assembler,
debugging,
windbg,
Windows
суббота, 7 марта 2015 г.
Пару слов о конференции C++ Russia 27-28 февраля 2015
Вступление
Я посетил конференцию http://meetingcpp.ru/, данная конференция посвящена языку C++ и проводится регулярно в России. Итак, ниже мои впечатления о конференции. Я разделил доклады на несколько основных направлений, хотя на самой конференции такого деления и не проводилось.
Ярлыки:
метапрограммирование,
программирование,
boost,
c++,
cpprussia
четверг, 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?
В данном случае мне кажется, что проще привести пример, который обрисует проблему. Итак, предположим, нам необходим список, содержащий функции со следующей сигнатурой:
Окей, скажем мы:
Но, что если мы хотим хранить не только функции, но и объекты у которых есть оператор (), возвращающий int. В таком случае, мы могли бы сделать базовый класс:
Но в таком случае мы ограничены только теми объектами, которые являются наследниками класса nullary_function_base. Как быть с функторами, которые получаются, например, в результате использования std::bind1st и пр.? Ведь в этом случае мы уже не можем сделать его наследником nullary_function_base. Или если используется обобщенное программирование и тип функтора просто неизвестен (например, внутри шаблонного класса, функции)?
Вот как раз для решения такой проблемы и используется 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 |
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 |
Вот как раз для решения такой проблемы и используется type erasure.
Ярлыки:
программирование,
рефакторинг,
boost,
boost::bind,
boost::function,
c++,
googlemock,
googletest,
shared_ptr,
TDD,
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 объявлен устаревшим, что нужно использовать вместо него, и какие возможности есть в компиляторах не поддерживающих новый стандарт.
В данном примере мы рассмотрим три вида smart pointer. Все они предоставляют практические одинаковые возможности по управлению raw pointer. Также мне бы хотелось разобраться почему в новом стандарте C++11 auto_ptr объявлен устаревшим, что нужно использовать вместо него, и какие возможности есть в компиляторах не поддерживающих новый стандарт.
Ярлыки:
программирование,
с++,
auto_ptr,
boost,
QScopedPointer,
RAII,
scoped_ptr,
smart_ptr,
unique_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 сборки (на самом деле - мой любимый редактор :)).
Итак поехали
Ярлыки:
программирование,
boost,
c++,
cmake,
googlemock,
googletest,
TDD
суббота, 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).
Ярлыки:
метапрограммирование,
boost,
c++,
metaprogramming,
mpl
воскресенье, 31 октября 2010 г.
Парсер csv
Недавно мне понадобилось парсить файл формата csv. При этом каждый элемент соответствует некоторому полю структуры, например:
Содержимое файла csv:
some string,1,some string 2,100500
hello, 2,good bye,111111
Структура, которую необходимо заполнить:
Используем для этих boost:
Нам понадобятся две библиотеки: tokenizer и lexical_cast
Содержимое файла 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 |
Нам понадобятся две библиотеки: 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 г.
Подписаться на:
Сообщения (Atom)