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, похоже, тоже предлагает это.
Обратите внимание, что один источник утечек с интеллектуальные указатели подсчета ссылок является указателями с круговые зависимости . Например, A имеют интеллектуальный указатель к B, и B имеют интеллектуальный указатель к A. Ни A, ни B не будут уничтожены. Необходимо будет найти и затем повредить зависимости.
, Если возможно, используйте интеллектуальные указатели повышения и используйте shared_ptr для указателей, которые, как предполагается, являются владельцами данных, и weak_ptr для указателей, которые, как не предполагают, звонили, удаляют.
Путем я делаю это просто: - на каждом AddRef () рекордный стек вызовов, - соответствие Выпуску () удаляет его. Этот путь в конце программы меня оставляют с AddRefs (), не соответствуя Выпускам. Никакая потребность соответствовать парам,
Если можно воспроизвести утечку детерминированным способом, простая техника, которую я часто использовал, состоит в том, чтобы пронумеровать все интеллектуальные указатели в их порядке конструкции (используйте статический счетчик в конструкторе), и сообщите об этом идентификаторе вместе с утечкой. Затем запустите программу снова и инициируйте DebugBreak (), когда интеллектуальный указатель с тем же идентификатором будет создан.
необходимо также рассмотреть этот большой инструмент: http://www.codeproject.com/KB/applications/visualleakdetector.aspx
То, что я делаю, является переносом интеллектуальный указатель с классом, который берет ФУНКЦИЯ и СТРОКА параметры. Увеличьте счет для той функции и выровняйте каждый раз, когда конструктора вызывают, и постепенно уменьшите количество каждый раз, когда деструктор называют. затем, запишите функцию, которая выводит информацию о функции/строке/количестве. Это говорит Вам, где все Ваши ссылки были созданы
Это не вопрос нахождения утечки. В случае интеллектуальных указателей это будет по всей вероятности прямо к некоторому универсальному месту как CreateObject (), который называют тысячами времени. Это - вопрос определения, на чем место в коде не назвало Выпуск () касательно - считаемый объект.
Что я сделал для решения, это должно переопределить malloc/new & освобождают/удаляют операторы, таким образом, что они отслеживают в структуре данных как можно больше об операции, которую Вы выполняете.
, Например, при переопределении malloc/new, можно создать запись адреса вызывающей стороны, сумму байтов, которые требуют, присвоенное возвращенное значение указателя и идентификатор последовательности, таким образом, все записи могут быть упорядочены (я не знаю, имеете ли Вы дело с потоками, но необходимо принять это во внимание, также).
При записи эти освобождают/удаляют стандартные программы, я также отслеживаю адрес вызывающей стороны и информацию об указателе Затем, я назад изучаю список и попытку соответствовать дубликат malloc/new с помощью указателя в качестве моего ключа. Если я не нахожу его, повысьте красный флаг.
, Если можно предоставить его, можно встроить в данные идентификатор последовательности, чтобы быть абсолютно уверенными, кто и когда вызов выделения был выполнен. Ключ здесь должен однозначно определить каждую пару транзакции так, как мы можем.
Затем у Вас будет третья стандартная программа, отображающая Вашу историю выделений/освобождения памяти, наряду с функциями, вызывающими каждую транзакцию. (это может быть выполнено путем парсинга символьной карты из компоновщика). Вы будете знать, сколько памяти Вы выделите в любое время и кто сделал это.
, Если у Вас нет достаточного количества ресурсов для выполнения этих транзакций (мой типичный случай для 8-разрядных микроконтроллеров), можно произвести ту же информацию по последовательной ссылке или ссылке TCP на другую машину с достаточным количеством ресурсов.
Так как Вы сказали использование Windows Вы можете использовать в своих интересах утилиту "кучи" дампа непривилегированного режима Microsoft, UMDH, который идет эти Средства отладки для Windows . UMDH делает снимки из использования памяти Вашего приложения, записывая стек, используемый для каждого выделения, и позволяет Вам сравнить несколько снимков для наблюдения, какие вызовы к средству выделения "пропустили" память. Это также переводит отслеживания стека в символы для Вас использующий dbghelp.dll.
существует также другой инструмент Microsoft под названием "LeakDiag", который поддерживает больше средств выделения памяти, чем UMDH, но это немного более трудно найти и, кажется, активно не сохраняется. Последней версии по крайней мере пять лет, если я вспоминаю правильно.
Для обнаружения ссылочных циклов, у Вас должен быть график всех считаемых на ссылку объектов. Такой график не легко создать, но он может быть сделан.
Создают глобальное set<CRefCounted*>
для регистрации живущих считаемых на ссылку объектов. Это легче, если у Вас есть общий AddRef (), реализация - просто добавляет this
указатель на набор, когда подсчет ссылок объекта идет от 0 до 1. Точно так же в Выпуске () удаляют объект из набора, когда это - подсчет ссылок, идет от 1 до 0.
Затем, обеспечивают некоторый способ получить набор ссылочных объектов от каждого CRefCounted*
. Это могло быть virtual set<CRefCounted*> CRefCounted::get_children()
или безотносительно исков Вы. Теперь у Вас есть способ обойти график.
Наконец, реализуйте свой любимый алгоритм для обнаружение цикла в ориентированном графе . Запустите программу, создайте некоторые циклы и детектор выполняемого цикла.Приятного отдыха! :)
На вашем месте я взял бы журнал и записал бы быстрый сценарий, чтобы сделать что-то как следующее (мой находится в 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
}
Это в основном проходит журнал и получает каждое выделение/освобождение и хранит уникальное значение для каждой пары, затем отсортируйте его и удалите пар, которые соответствуют, видят то, что оставляют.
Обновление: Извините за все посреднические редактирования (я случайно отправил, прежде чем я был сделан)
Я - большой поклонник Heapchecker Google - он не поймает все утечки, но он получает максимум от них. ( Подсказка : Свяжите его в весь свой unittests.)