Re[4]: Самый хитрый баг
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 30.03.06 21:13
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

VAB>>добавлю, что все это в настоящее время делает Driver Verifier & Application Verifier
Автор: Valery A. Boronin
Дата: 02.01.06
в ядре и user mode соотв.


ЕМ>Ага, щаз Их не иначе, как телепаты писали, и научили догадываться, как проверять целостность каждого объекта И статически размещенные объекты они тоже мусором прописывают, чтобы правильность инициализации в конструкторе проверить?


выделяемые блоки памяти таким макаром защищаются, это точно. с конструкторами же в С тяжко.
насчет постоянной проверки целостности — это уже конечно руками ибо критерий целостности в общем виде не совсем ясен...
но все равно первые 2 пункта из 4х покрываются

VAB>>PS отмечу что подобные "свои" или стянутые у Руссиновича verifiers (MemAllocatePool and other MemXxx wrappers кто помнит) были практически у всех разработчиков в то время...


ЕМ>Только блоки памяти проверять — это меньшая часть заботы...

...и тем не менее почему бы ее не поручить спец инструментам
... << RSDN@Home 1.2.0 alpha rev. 648>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[5]: Самый хитрый баг
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.03.06 05:35
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:

VAB>с конструкторами же в С тяжко.


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

VAB>насчет постоянной проверки целостности — это уже конечно руками ибо критерий целостности в общем виде не совсем ясен...


Тоже гораздо удобнее в C++. Заводится в каждом классе функция Check, и натыкивается вызовов везде, где можно, включая обращения к объектам из "чужих" классов. В plain C придется извращаться с префиксами/суффиксами, теряется прозрачность.

ЕМ>>Только блоки памяти проверять — это меньшая часть заботы...


VAB>...и тем не менее почему бы ее не поручить спец инструментам


Хотя бы потому, что специнструменты сообщат лишь о факте нарушения, и не более того. Например, Driver Verifier, обнаружив при выгрузке драйвера неосвобожденные блоки памяти, не находит ничего умнее, как свалить систему в BSOD, указав только количество неосвобожденных блоков, а толку с этого — почти никакого. Собственная же система управления памятью, во-первых, перечислит все блоки с адресами, размерами и метками (либо адресами, из которых вызывался new), а, во-вторых, сама их освободит. Чаще всего ничем страшным это не грозит, на перезагрузках экономится немало времени.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Самый хитрый баг
От: Danchik Украина  
Дата: 31.03.06 13:33
Оценка:
Здравствуйте, Tom, Вы писали:

[Skip]

Tom>Если можно — вышли


Already sent

Tom>PS:

Tom> А чем вышеописанные действия отличаются от того, что делает DevPartner? Просто с ним воспроизвести данный баг — нереально, из за огромного падения производительности

Чесно не скажу, DevPartner не пробовал
Re[3]: Самый хитрый баг
От: borech Россия  
Дата: 24.04.06 15:21
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Здравствуйте, Valery A. Boronin, Вы писали:


D>[Skip]


VAB>>если известна область памяти которая затирается — если повезет и она одна и та же иногда, то есть решение


VAB>>- подключите к машине отладчик удаленный (WinDbg + VM Ware сгодится)

VAB>>- путем проигрывания проблемного сценария в виртуалке (чтобы шансы на воспроизведение были выше, лучше заснапшотить поближе к моменту падения и одно и тоже состояние проигрывать в надежде на те же адреса и т.п.), можно сделать так:
VAB>>- сначала падаем и смотрим по какому адресу проблема, адрес-диапазон запоминаем
VAB>>- перезапуск виртуалки и в отладчике ставим бряки на запись по этому адресу
VAB>>- удим рыбу

D>Могу предложить даже готовое решение как выловить такое место.

D>Есть такой продукт SmartHeap, который реализует скоростной менеджер кучи (подменяются все New, Alloc, etc.). В нем есть Debug DLL со множествами способов отладки таких ситуаций:

D>1. К каждому выделенному указателю присобачивается вначале и в конце дополнительные контрольные байты. Если их кто то перетер то через секунд 5 (настривается) выскакивает диалжг "Типа AAA указатель такой то был перетерт" — типа переполнение буфера, с дикой информацией Время выделения, CallStack выделения, Поток, иеще куча всего.


D>2. Некоторые указатели можна поставить на мониторинг, система буте следить что бы в них ничего не изменилось, случайно Работает по принципу чеканья области памяти на CRC через определенное время


D>3. DeferFree — интересная штука. Вы освобождаете указатель, но система не отдает его обратно в кучу, а держит его определенное время, забивает его специальными символами и следит что бы в него никто не записал.


D>4. Может и не все вспомнил... Читайте что можна тут: HeapAgent. Если заинтересовало, могу для теста выслать (продукт совсем и даже очень не бесплатный)


а можно мне тоже HeapAgent? очень надо...
Re[3]: Самый хитрый баг
От: runt1m3  
Дата: 24.04.06 16:44
Оценка:
D>4. Может и не все вспомнил... Читайте что можна тут: HeapAgent. Если заинтересовало, могу для теста выслать (продукт совсем и даже очень не бесплатный)

Давайте меняться, меняю агент на последний смартхип!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.