Я унаследовал некоторый унаследованный код и, похоже, где-то есть утечка памяти. Мой первый инстинкт должен был просто скомпилировать сLeakSanitizer: получать отчеты об утечках времени выполнения?
-faddress=sanitize -fno-omit-frame-pointer
и пусть семья по адресу SANITIZER о инструментов поиска утечки для меня. Однако я был очень разочарован. Я надеялся на какое-то сообщение об ошибке времени выполнения (похожее на ошибку sanitizer адреса при чтении или записи памяти, которую вы не должны). Дезинфицирующее средство для утечки, по-видимому, не анализирует проверку утечки до тех пор, пока программа не завершится успешно. Моя проблема заключается в том, что укомплектованный мной код имеет несколько потоков, и он не был предназначен для присоединения к ним всех при подготовке к мягкой посадке.
я упростил мою проблему в простом примере:
#include <thread>
#include <chrono>
#include <iostream>
bool exit_thread = false;
void threadFunc()
{
while(!exit_thread)
{
char* leak = new char[256];
std::this_thread::sleep_for(std::chrono::seconds{1});
}
}
int main() {
std::thread t(threadFunc);
std::cout << "Waiting\n";
std::this_thread::sleep_for(std::chrono::seconds{5});
exit_thread = true;
std::cout << "Exiting\n";
//Without joining here I do not get the leak report.
t.join();
return 0;
}
Я компилировать это с
clang++ leaker.cpp -fsanitize=address -fno-omit-frame-pointer -g -O0 -std=c++1y -o leaker
А потом побежал с
ASAN_OPTIONS='detect_leaks=1' LSAN_OPTIONS='exitcode=55:report_objects=true:log_threads=true:log_pointers=true' ./leaker
(я вроде обезумела на «LSAN_OPTIONS» здесь, потому что я играл вокруг ... ни один из вариантов не сделал то, что я хотел, но должен был выйти из u pon изучение утечки).
Как отмечено в коде, если я присоединяюсь к потоку, то выйдите из программы, я получаю довольно отчет об утечке. Иначе ничего не получаю. Поскольку вы можете отслеживать показы 10-100 потоков в устаревшей кодовой базе и, что делает их все хорошо сглажено.
Несколько лет назад я помню, как играл с Visual Leak Detector и имел удачу с ним, потому что он создавал бы отчеты со всеми потенциальными утечками памяти (и я не помнил, чтобы все было хорошо). Проблема в том, что этот инструмент предназначен только для Windows, а мой код работает только с Linux. Могу ли я заставить инструмент LeakSanitizer сделать что-то подобное?
Вы можете посмотреть в [Valgrind] (http://valgrind.org/). –
К сожалению, мое приложение не может справиться с замедлением valgrind – rmccabe3701