Как получить трассировку стека при отслеживании утечек памяти? - PullRequest
4 голосов
/ 16 августа 2010

Я написал систему отслеживания памяти на c ++, используя Detours для исправления различных функций выделения памяти. Когда я получаю вызов malloc в дополнение к malloc, я также сохраняю трассировку стека (чтобы я мог точно определить утечку).

Единственный надежный способ получить точную трассировку стека - это использовать StackWalk64 (я пробовал RtlCaptureStackBackTrace, и это удалось только для очень простых стеков).

Однако вот моя проблема, StackWalk64 вызывает malloc, который, в свою очередь, вызывает StackWalk64 и приводит к переполнению стека. Теперь у меня может быть флаг, который работает с рекурсивными вызовами, однако он не работает с несколькими потоками

Мне было интересно, есть ли у кого-нибудь возможное решение этого маринада.

Спасибо Рич Карлесс

Ответы [ 2 ]

1 голос
/ 16 августа 2010

Не могли бы вы использовать локальный флаг потока в вашей реализации malloc для предотвращения рекурсивных вызовов StackWalk64?

0 голосов
/ 17 августа 2010

Однажды у нас была похожая проблема, и мы решили ее, предварительно связав код отладочной печати с другой (модифицированной) версией malloc, которая была взята из glibc и немного модифицирована для работы с предварительно выделенным буфером (мы хотели избежать какой-либо активности памяти в сторону ОС в нашем случае). Однако я не могу сказать, насколько сложна статическая предварительная связь в вашей системе.

...