Найдите утечки памяти вызванными интеллектуальными указателями

API для chrome.tabs.getSelected (), который использует принятый ответ, устарел. Вместо этого вы должны получить текущую вкладку и перезагрузить ее, используя следующее:

chrome.tabs.query({active: true, currentWindow: true}, function (arrayOfTabs) {
    var code = 'window.location.reload();';
    chrome.tabs.executeScript(arrayOfTabs[0].id, {code: code});
});

Или, возможно:

chrome.tabs.query({active: true, currentWindow: true}, function (arrayOfTabs) {
    chrome.tabs.reload(arrayOfTabs[0].id);
});

Мне не повезло со второй версией, хотя другие ответы, похоже, подсказывают, что это должно сработать. API, похоже, тоже предлагает это.

18
задан Thomas Koschel 21 September 2008 в 14:27
поделиться

11 ответов

Обратите внимание, что один источник утечек с интеллектуальные указатели подсчета ссылок является указателями с круговые зависимости . Например, A имеют интеллектуальный указатель к B, и B имеют интеллектуальный указатель к A. Ни A, ни B не будут уничтожены. Необходимо будет найти и затем повредить зависимости.

, Если возможно, используйте интеллектуальные указатели повышения и используйте shared_ptr для указателей, которые, как предполагается, являются владельцами данных, и weak_ptr для указателей, которые, как не предполагают, звонили, удаляют.

17
ответ дан 30 November 2019 в 06:51
поделиться

Путем я делаю это просто: - на каждом AddRef () рекордный стек вызовов, - соответствие Выпуску () удаляет его. Этот путь в конце программы меня оставляют с AddRefs (), не соответствуя Выпускам. Никакая потребность соответствовать парам,

6
ответ дан 30 November 2019 в 06:51
поделиться

Если можно воспроизвести утечку детерминированным способом, простая техника, которую я часто использовал, состоит в том, чтобы пронумеровать все интеллектуальные указатели в их порядке конструкции (используйте статический счетчик в конструкторе), и сообщите об этом идентификаторе вместе с утечкой. Затем запустите программу снова и инициируйте DebugBreak (), когда интеллектуальный указатель с тем же идентификатором будет создан.

необходимо также рассмотреть этот большой инструмент: http://www.codeproject.com/KB/applications/visualleakdetector.aspx

4
ответ дан 30 November 2019 в 06:51
поделиться

То, что я делаю, является переносом интеллектуальный указатель с классом, который берет ФУНКЦИЯ и СТРОКА параметры. Увеличьте счет для той функции и выровняйте каждый раз, когда конструктора вызывают, и постепенно уменьшите количество каждый раз, когда деструктор называют. затем, запишите функцию, которая выводит информацию о функции/строке/количестве. Это говорит Вам, где все Ваши ссылки были созданы

4
ответ дан 30 November 2019 в 06:51
поделиться

Это не вопрос нахождения утечки. В случае интеллектуальных указателей это будет по всей вероятности прямо к некоторому универсальному месту как CreateObject (), который называют тысячами времени. Это - вопрос определения, на чем место в коде не назвало Выпуск () касательно - считаемый объект.

2
ответ дан 30 November 2019 в 06:51
поделиться

Что я сделал для решения, это должно переопределить malloc/new & освобождают/удаляют операторы, таким образом, что они отслеживают в структуре данных как можно больше об операции, которую Вы выполняете.

, Например, при переопределении malloc/new, можно создать запись адреса вызывающей стороны, сумму байтов, которые требуют, присвоенное возвращенное значение указателя и идентификатор последовательности, таким образом, все записи могут быть упорядочены (я не знаю, имеете ли Вы дело с потоками, но необходимо принять это во внимание, также).

При записи эти освобождают/удаляют стандартные программы, я также отслеживаю адрес вызывающей стороны и информацию об указателе Затем, я назад изучаю список и попытку соответствовать дубликат malloc/new с помощью указателя в качестве моего ключа. Если я не нахожу его, повысьте красный флаг.

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

Затем у Вас будет третья стандартная программа, отображающая Вашу историю выделений/освобождения памяти, наряду с функциями, вызывающими каждую транзакцию. (это может быть выполнено путем парсинга символьной карты из компоновщика). Вы будете знать, сколько памяти Вы выделите в любое время и кто сделал это.

, Если у Вас нет достаточного количества ресурсов для выполнения этих транзакций (мой типичный случай для 8-разрядных микроконтроллеров), можно произвести ту же информацию по последовательной ссылке или ссылке TCP на другую машину с достаточным количеством ресурсов.

2
ответ дан 30 November 2019 в 06:51
поделиться

Так как Вы сказали использование Windows Вы можете использовать в своих интересах утилиту "кучи" дампа непривилегированного режима Microsoft, UMDH, который идет эти Средства отладки для Windows . UMDH делает снимки из использования памяти Вашего приложения, записывая стек, используемый для каждого выделения, и позволяет Вам сравнить несколько снимков для наблюдения, какие вызовы к средству выделения "пропустили" память. Это также переводит отслеживания стека в символы для Вас использующий dbghelp.dll.

существует также другой инструмент Microsoft под названием "LeakDiag", который поддерживает больше средств выделения памяти, чем UMDH, но это немного более трудно найти и, кажется, активно не сохраняется. Последней версии по крайней мере пять лет, если я вспоминаю правильно.

2
ответ дан 30 November 2019 в 06:51
поделиться

Для обнаружения ссылочных циклов, у Вас должен быть график всех считаемых на ссылку объектов. Такой график не легко создать, но он может быть сделан.

Создают глобальное set<CRefCounted*> для регистрации живущих считаемых на ссылку объектов. Это легче, если у Вас есть общий AddRef (), реализация - просто добавляет this указатель на набор, когда подсчет ссылок объекта идет от 0 до 1. Точно так же в Выпуске () удаляют объект из набора, когда это - подсчет ссылок, идет от 1 до 0.

Затем, обеспечивают некоторый способ получить набор ссылочных объектов от каждого CRefCounted*. Это могло быть virtual set<CRefCounted*> CRefCounted::get_children() или безотносительно исков Вы. Теперь у Вас есть способ обойти график.

Наконец, реализуйте свой любимый алгоритм для обнаружение цикла в ориентированном графе . Запустите программу, создайте некоторые циклы и детектор выполняемого цикла.Приятного отдыха! :)

4
ответ дан 30 November 2019 в 06:51
поделиться

На вашем месте я взял бы журнал и записал бы быстрый сценарий, чтобы сделать что-то как следующее (мой находится в Ruby):

def allocation?(line)
  # determine if this line is a log line indicating allocation/deallocation
end

def unique_stack(line)
  # return a string that is equal for pairs of allocation/deallocation
end

allocations = []
file = File.new "the-log.log"
file.each_line { |line|
  # custom function to determine if line is an alloc/dealloc
  if allocation? line
    # custom function to get unique stack trace where the return value
    # is the same for a alloc and dealloc
    allocations[allocations.length] = unique_stack line
  end
}

allocations.sort!

# go through and remove pairs of allocations that equal,
# ideally 1 will be remaining....
index = 0

while index < allocations.size - 1
  if allocations[index] == allocations[index + 1]
    allocations.delete_at index
  else
    index = index + 1
  end
end

allocations.each { |line|
  puts line
}

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

Обновление: Извините за все посреднические редактирования (я случайно отправил, прежде чем я был сделан)

1
ответ дан 30 November 2019 в 06:51
поделиться

Я - большой поклонник Heapchecker Google - он не поймает все утечки, но он получает максимум от них. ( Подсказка : Свяжите его в весь свой unittests.)

1
ответ дан 30 November 2019 в 06:51
поделиться
1
ответ дан 30 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: