понедельник, Февраль 08, 2010

Heap corruption и работа с дебажной кучей

Немного расскажу про дебажную кучу, речь пойдет о Visual Studio 2008. В остальных версиях дебажная куча выглядит примерно так же. Про другие компиляторы не знаю.

Основная мысль - дебажная куча отличается от релизной, чтобы облегчить отладку. И, если в дебаге произойдет порча памяти, то ее можно отловить. Visual Studio выдает в таком случае окно с сообщением и пишет в Output что-то вроде


Heap corruption at address.
HEAP[MyProg.exe]: Heap block at 0AC6A400 modified at 0AC6A6EC
past requested size of 2e4

Итак, в чем состоят отличия и каким образом отлавливаются ошибки. Давайте я пример приведу, с примером удобнее.
class CBase 
{
public:
int BaseI;
int BaseJ;
};

class CDerived : public CBase
{
public:
int DerivedI;
};

int main()
{
CBase *pBase = new CBase;//(1)

pBase->BaseI = 3;
pBase->BaseJ = 4;//(2)

delete pBase;//(3)

return 0;
}


Как будет выглядеть память в точке (1). (Чтобы вывести окно с памятью, выберите Debug->Windows->Memory->Memory1).

0x00984ED8  cd cd cd cd cd cd cd cd fd fd fd fd 00 00 00 00


У меня экземпляр класса CBase расположился по адресу 0x00984ED8. Оба int'а, а это восемь байт, заполнены значением 0xCD, Clean Memory. Это значение по умолчанию.
Дальше четыре байта 0XFD, Fence Memory, она же "no mans land". Это такой заборчик, которым обрамляется свежевыделенная память. Перед адресом 0x00984ED8 стоят точно такие же четыре байта.

Точка (2).
0x00984ED8  03 00 00 00 04 00 00 00 fd fd fd fd 00 00 00 00


Мы записали значения 3 и 4 и они идут одно за другим. Младший байт идет первым, потому что я работают с little endian платформой.

Точка (3)
0x00984ED8  dd dd dd dd dd dd dd dd dd dd dd dd 00 00 00 00

Память после удаления заполняется значениями 0xDD, Dead Memory. После вызова функции HeapFree() будет заполнена значениями 0xFEEEFEEE.


Давайте теперь сымитируем багу и посмотрим как Visual Studio ее поймает. Это реальная бага, я ее упростила до синтетического примера. На самом деле кода было больше и он был размазан по нескольким функциям.


CBase *pBase = new CBase;//(1)

pBase->BaseI = 3;
pBase->BaseJ = 4;//(2)

CDerived* pDerived = static_cast<CDerived*>(pBase);

pDerived->DerivedI = 7;//(3)
delete pBase;


Итак, мы стали приводить по иерархии с помощью static_cast'а, вместо dynamic_cast'а. Что в итоге получили. В точках (1) и (2) программа выглядит все также. В точке (3) мы полезли в чужую память и затерли забор.
03 00 00 00 04 00 00 00 07 00 00 00 00 00 00 00


После попытки вызвать delete pBase мы получим сообщение об ошибке, потому что забора нет, а это означает, что мы лазили в чужую память.

HEAP CORRUPTION DETECTED: after Normal block (#68) at 0x008D4ED8.
CRT detected that the application wrote to memory after end of heap buffer.


Еще различия между дебажной и релизной кучами приводят к тому, что программа начинает себя вести по-разному в дебаге и в релизе. Простой пример - дебажная "падает", релизная нет. Очень может быть, что "падение" - это не падение вовсе, а как раз сообщение о порче памяти. Почитайте повнимательнее, что там в окне написано.
Также народ жалуется, что дебажная версия работает сильно меденнее релизной. Причиной этого в том числе может быть дебажная куча. В интернетах пишут, что можно ее в дебаге отключить то ли с помощью переменной окружения _NO_DEBUG_HEAP, то ли NO_DEBUG_HEAP, в единицу ее надо выставить. Я пробовала ее отключить, куча осталась дебажной.

Ссылки по теме:
Win32 Debug CRT Heap Internals
Inside CRT: Debug Heap Management
Memory Management and the Debug Heap (MSDN)
Приведение типов в C++

пятница, Февраль 05, 2010

LSP демотиватор



Отсюда

среда, Февраль 03, 2010

Немного про биопринтеры, технологическую сингулярность и трансгуманистов

Презентация биопринтера, т.е. принтера, на котором можно печатать человеческие органы, произвела сенсацию на TEDMED в конце прошлого года. Полный ролик выступления Энтони Аталы (Anthony Atala) TED'овцы выложили совсем недавно.

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

Вот полный ролик с TED'а.


Интересно, реальность гораздо интереснее фантастики. По крайней мере, я никогда и нигде про биопринтеры не читала.

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


Технологическая сингулярность

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

Технологическая сингулярность - это только теория, доказать ее никто не доказывал, да я и не думаю, что такое доказательство в принципе возможно. Однако теория эта довольно популярна и пропагандируется трансгуманистами. Это люди, которые считают, что нужно всячески совершенствовать человека, используя для этого достижения науки. Они поддерживают крионику, любят рассуждать о создании ИИ и иммортализме(бессмертии), ну и о технологической сингулярности тоже. Считают, что технологическая сингулярность настанет непременно раньше 2050 года.

Ребята они задорные, мне нравится их искренность, энтузиазм и вера в светлое будущее. Однако, у них популярна идея смены парадигмы, которая состоит в том, что чем больше людей верят в технологическую сингулярность, тем быстрее она наступит. Поэтому они активно пиарят идеи трансгуманизма и не всегда у них получается вовремя остановиться. Пиар бывает разный. Например, они проделывают огромную работу для распространения информации о научных достижениях, что есть хорошо. Правда, слова действуют на людей гораздо хуже, чем красивые картинки, тот же фильм "Аватар" сделал для пиара идеи загрузки сознания больше, чем все трансгуманисты вместе взятые. (Хотя, вряд ли Камерон ставил себе такую цель :-)).

Трансгуманисты в лицах
Несколько человек, про которых я более-менее что-то знаю.




Рэймонд Курцвейл (Raymond Kurzweil). Самый известный трансгуманист, о нем даже фильм сняли. Странен. Автор многочисленных футурологических книг.



Элизар Юдковски (Eliezer Yudkowsky). Автор термина "дружественный искусственный интеллект" (Friendly artificial intelligence, FAI). Основатель коммьюнити-блога Less Wrong.



Майкл Аниссимов (Michael Anissimov) - автор блога Accelerating future, много ездит с лекциями



Обри ди Грей(Aubrey de Grey) - геронтолог. Активно призывает к борьбе со старением.

Про борьбу со старением чуть подробнее...

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

Много пишут про то, что исследования в области борьбы со старением проводить надо и пытаются переубедить тех, кто думает иначе. У меня сомнений по этому поводу нет, поэтому едем дальше. (У кого есть - посмотрите доклад Обри ди Грея).

Михаил Батин периодически приглашает всех желающих в свой московский офис где рассказывает о себе, можно сходить, весело провести вечер.

Я там побывала, послушала. Нормальные ребята, адекватны. В отличие от большинства трансгуманистов, которые только рассказывают про то как оно будет, они более целеустремленные. Занимаются финансированием исследований в области борьбы со старением. Активно пиарятся, чтобы сформировать "социальный заказ" на эти исследования и тем самым привлечь больше денег. Мне этот пиар не очень нравится, но, с другой стороны, я понятия не имеют как формировать социальные заказы и ничего лучше предложить не могу.

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

В целом, по поводу старения. Мне незамутненное мнение неспециалиста. Даже если удастся придушить причины, ведущие к старению, мы воткнемся в новые проблемы и в лучшем случае здесь стоит говорить о продлении жизни и улучшении качества жизни. То есть иммортализм - это такая линия горизонта, которая все время отодвигается по мере приближения к ней. Однако исследование причин старения - это лучшее понимание природы человека и различных заболеваний. Лечение заболеваний типа болезни Альцгеймера имморталисты рассматривают как побочный результат своей деятельности, но для меня он самый что ни на есть основной. Короче, я двумя руками "за".



Ну вот и всё на сегодня, как говорится. Я специально описала все очень кратко, если вам интересно - ссылок я привела достаточно, найдете что почитать :-). В дальнейшем я буду делать посты про всякие интересные штуки, идти они будут под тегом future.

понедельник, Февраль 01, 2010

Visual Studio 2010 доступна для скачивания

Visual Studio 2010 Express и бета полной версии уже некоторое время доступны для скачивания. Будут работать до 30 июня 2010. Там есть некоторые фичи из С++0x.

По ссылке отсюда.