Mac OS: утечки дезинфицирующего средства - PullRequest
0 голосов
/ 24 ноября 2018

Mac OS X Sierra 10.13

Я делаю, как написано здесь https://clang.llvm.org/docs/LeakSanitizer.html

Т.е. создал небольшое приложение с утечкой памяти

#include <stdlib.h>
void *p;
int main() {
  p = malloc(7);
  p = 0; // The memory is leaked here.
  return 0;
}

Затем соберите его и запуститечтобы проверить, как обнаружена утечка памяти:

admins-Mac:test2 admin$ clang -fsanitize=address -g mleak.c ; ASAN_OPTIONS=detect_leaks=1 ./a.out
==556==AddressSanitizer: detect_leaks is not supported on this platform.
Abort trap: 6
admins-Mac:test2 admin$ 

Как я могу обнаружить утечку?Мне нужно использовать его для моего большого приложения.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Обратите внимание, что вы также можете использовать Leaks Instrument, который поставляется с Xcode, чтобы найти утечки в вашем коде без необходимости устанавливать что-либо дополнительное.Это не очень хорошо рекламируется, но это очень полезный инструмент.В меню «Продукт» выберите «Профиль».Это может перестроить ваше приложение, а затем запустит Instruments.app.Вам будет представлен лист различных инструментов профилирования, которые вы можете использовать следующим образом:

The profile chooser for Instruments.app

Как только вы выберете его и нажмете кнопку «запись», оно запустит ваше приложение и отобразит трек, показывающий любые утечки, например:

The main window of the Leaks instrument in Instruments.app

Зеленый флажок означает, что в приложении нет утечек.время.Красный «х» означает новую утечку с момента последней проверки.Серое «-» означает, что есть утечки, но нет новых с момента последней проверки.По умолчанию проверка выполняется каждые 10 секунд.

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

Это очень мощный инструмент, почти не имеющий документации!Я не уверен, почему Apple скрывает это.

0 голосов
/ 21 апреля 2019

Похоже, что Clang / LLVM, поставляемый Apple, не поддерживает -fsanitize=leak.Я исправил это, установив LLVM на Homebrew.Более подробное исправление для gist

$ brew install llvm@8

# Overwritten default Clang
$ echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> .zshrc

$ source ~/.zshrc
$ which clang
/usr/local/opt/llvm/bin/clang
...