![]() |
|
![]() ![]() ![]() |
|
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: нет Всего: 196 |
Ну что ж, вперед - доказывай или опровергай.
|
||||
|
|||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Попробую. О результатах будет доложено ![]() Раз уж пошло такое дело, еще вопрос: Под VS 2005, вроде, мне удается более-менее контролировать утечки памяти с помощью _Crt функций. А вот из под Builder`а не получается до них добраться. Они в нем вообще есть ? Если нет, то как можно контролировать в нем утечки памяти ? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: нет Всего: 196 |
во, во... CodeGuard тебе в помощь. Активируешь его, запускаешь прогу, и у тебя вылазиет полный список ошибок работы с памятью. |
|||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Какие-то странные результаты. Имеем код:
Получаем такие сообщения: malloc/free: 203854 new/delete: 268167 MemoryManagerEx: 160868 Либо я чего-то не понимаю, либо где-то партачу, либо Борландовский менеджер опять на коне ![]() Добавлено через 1 минуту и 56 секунд Как-то код неправильно отформатировался. Sorry. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: нет Всего: 196 |
видимо его специально оптимизировали.
|
|||
|
||||
Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Может кому будет интересно: Один мой знакомый заинтересовался механизмом работы с памятью и быстродействием. Вот что он пишет: ".............. В результате исследований выяснилось, что занимает больше памяти совсем не строки, вопреки моим ожиданиям, а некоторые структуры. Переупорядочил поля тех структур - получил в одном случае более 10% экономии, другие проверить не могу пока, но думаю там сэкономлено больше. Надеюсь дадут ещё время на это, есть ещё как и более глубокие идеи оптимизации, так и идеи насчёт улучшения средства исследования (которое пока то ли работает то ли не работает - об этом ниже). Детоуринг RtlAllocateHeap/RtlReAllocateHeap/RtlFreeHeap - идея правильная. C++овский new сводится к сишонму malloc, оттуда вызывается HeapAlloc, оттуда уже RtlAllocateHeap. Внутри кое-каких майкрософтовских библиотек вызываются Heap* функции напрямую, всё равно попадаем туда же. WinAPI функции типа CreateWindow вызывают функции вроде LocalAlloc или HeapAlloc, всё равно идём в RtlAllocateHeap. Разумеется, не факт что malloc и GlobalAlloc будут _всегда_ сводится к RtlAllocateHeap, но похоже что в моём случае все существенные объёмы проходят через RtlAllocateHeap. Detours заинтересовала как она работает. Например, т.к. задача перехвата этим путём может быть разной сложности и в общем случае не решаема (функцию чисто из ret так не перехватишь), интересно как далеко она ушла в обработке сложных ситуаций. Также интересно насколько транзакция detours действительно транзакция. И если настолько, насколько я надеюсь, то как оно работает. Спуск по коллстеку через StackWalk или StackWalk64 - не всегда работает. На самом деле перед этой функцией стоит тоже в общем случае не решаемая задача. Реально получается интересный факт - с winapi до ехе спускается вседа, но со спуском из кода CRT до прикладного кода иногда проблемы. У StackWalk есть параметр ContextRecord. Глянь что про него в MSDN пишут. Оказывается, что если передать туда эту структуру, то StackWalk в состоянии обработать спуск с malloc до new, иначе - нет. Причём, заполнение структуры не влияет. Видимо влияет то заполнение, которое делается самой StackWalk в предыущих вызовах. Пока что самые существенные объёмы уже успешно обрабатываются, но будет время - попытаюсь добиться чтобы всё обрабатывалось. Анализ - прост как валенок. Начиная с начала профилируемого интервала при Alloc запоминаем в hash_map указатель как ключ, размер и стек вызовов в виде адресов возврата как значение. при Free удаляем. В конце профилируемого интервала для каждого оставшегося в hash_map адреса ищем адрес возврата своего кода: получаем файл исходников из адреса возрата, и функцией strstr проверяем его на принадлежность своему коду. Из всего этого составляем другой hash_map, здесь уже ключ - адрес_возврата_в_свой_код, значение - сумма выделенной памяти ( /* интересная тонкость STL: */ std::map<int,int> m; m[3] += 2; m[3] += 2; /* чему равно теперь m[3] ? думаешь неизвестно ? а вот и нет, оно будет равно 4. */ ). Теперь перекладываем содержимое этого мэпа в контейнер, соритрованый по получившемуся там размеру (я взял map), дополняем результат файлом и срокой и именем метода из адреса своего кода - вот и результат. Конечно, это не будет "максимально полная картина". Но уже представления что надо оптимизировать, а что нет - даёт. Теперь почему это "то ли работает то ли не работает". Разумеется мы должны защититься от повторного вхождения в перехваченные функции, кроме того т.к. хешмэпы не потокобезопасны, их нужно защитить. Казалось бы - критическая секция, а потом флаг уже вошли мы в перехваченую функцию или нет, если уже вошли - выходим. Но это приводит к дедлоку, т.к. Sym* и StackWalk выделяют что-то в другом потоке. Сейчас работает хитрая система из TLS и крит. секций, но я не уверен, что там всё ок. .........." |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |