Существует ли Valgrind Memcheck как инструмент для Windows для отладки использования после бесплатных ошибок?

Во время моей работы я регулярно сталкиваюсь с довольно распространенной ошибкой программирования - используя какой-то объект, который уже был освобожден. Это вызывает UB в C++. В Linux подобные проблемы обычно решаются с помощью инструмента Valgrind Memcheck. Из руководства Memcheck:

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

Memcheck предоставляет мне стек вызовов, где объект был освобожден, и я могу продолжить и отладить проблему. Существует ли аналогичный инструмент для окон с такой же функциональностью, желательно бесплатный?

5 ответов

Решение

Согласно документации доктора Памяти, есть -delay_frees_stack вариант с точно такой же функциональностью Valgrind. Из справочника опций:

-delay_frees_stack 
default: false 
Record callstacks on free to use when reporting use-after-free or other errors that overlap with freed objects. There is a slight performance hit incurred by this feature for malloc-intensive applications.

Также вот пример ошибки, сообщенной Dr. Memory:

Here is another example, using the -delay_frees_stack option to obtain the callstack of the freed memory:

Error #8: UNADDRESSABLE ACCESS: reading 0x001338a8-0x001338ac 4 byte(s)
# 0 unaddr_test1                    [e:\derek\drmemory\git\src\tests\suppress.c:110]
# 1 test                            [e:\derek\drmemory\git\src\tests\suppress.c:269]
# 2 main                            [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: @0:00:02.141 in thread 3024
Note: next higher malloc: 0x001338e8-0x00133938
Note: prev lower malloc:  0x001337e8-0x00133820
Note: 0x001338a8-0x001338ac overlaps memory 0x001338a8-0x001338c4 that was freed here:
Note: # 0 test                            [e:\derek\drmemory\git\src\tests\suppress.c:269]
Note: # 1 main                            [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: instruction: mov    (%eax) -> %eax

Как отметил Лейлин Чен в своем ответе на этот вопрос, попробуйте один из них:

Доктор Память: https://github.com/dynamorio/drmemory

UMDH: http://support.microsoft.com/kb/268343

AppVerifier: http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx

Метод, который работал для меня, состоял в том, чтобы написать собственный менеджер памяти, который предоставляет глобальным операторам "новый" и "удалить", и заблокировать каждый освобожденный / используемый блок памяти с помощью VirtualProtect. Таким образом, любая попытка использовать освобожденную память немедленно вызовет нарушение прав доступа, которое вы можете перехватить и отладить. Однако, чтобы сделать это, вы должны "захватить" всю доступную память (или 3/4), используя что-то вроде VirtualAlloc и каждый блок памяти, который вы возвращаете (из этого первоначально выделенного блока) должен быть PAGE_SIZE выровненный (см. GetSystemInfo документации), иначе вы не сможете надежно его заблокировать. Это означает, что даже тривиальному приложению может потребоваться большой объем памяти для использования этого метода.

Что касается "альтернативы Valgrind для Windows" - я не слышал об этом. Кто-то где-то писал, что может быть возможно скомпилировать / использовать valgrind с cygwin, но я не знаю, правда ли это или нет.

Вот отважная попытка Вальгринга, и я желаю им всего наилучшего:

http://sourceforge.net/p/valgrind4win/wiki/Home/

Тем не менее, я боюсь, что для реализации правильного "Valgrind для Windows" необходим доступ к исходному коду Windows.

IOW: когда свиньи летают

Для меня лучше всего было использовать Визуальный детектор утечек, все что мне нужно было сделать, это включить:

#include <vld.h>

в начале исполняемых файлов я хотел проверить. Затем запуск отладочного исполняемого файла изнутри Windows предоставит подробную информацию обо всей утечке памяти. Из вывода вы можете напрямую попасть в строку, где была выделена память, так что вы можете позаботиться

Другие вопросы по тегам