summaryrefslogtreecommitdiffstats
path: root/chrome/browser/task_manager
diff options
context:
space:
mode:
authorjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-24 08:16:21 +0000
committerjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-24 08:16:21 +0000
commit92bb14266f58bc16187b3cb1baba20ac0b3e4501 (patch)
treef48467669a0a14609349bce1621040a2cbbddf44 /chrome/browser/task_manager
parent51130b57a242bf009fee03c55728f76b8f845f13 (diff)
downloadchromium_src-92bb14266f58bc16187b3cb1baba20ac0b3e4501.zip
chromium_src-92bb14266f58bc16187b3cb1baba20ac0b3e4501.tar.gz
chromium_src-92bb14266f58bc16187b3cb1baba20ac0b3e4501.tar.bz2
Add debug code to figure out where we forget to delete TaskManagerRendererResources
BUG=165138 Review URL: https://codereview.chromium.org/11953049 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178551 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/task_manager')
-rw-r--r--chrome/browser/task_manager/task_manager_resource_providers.cc21
-rw-r--r--chrome/browser/task_manager/task_manager_resource_providers.h13
2 files changed, 32 insertions, 2 deletions
diff --git a/chrome/browser/task_manager/task_manager_resource_providers.cc b/chrome/browser/task_manager/task_manager_resource_providers.cc
index 966e9ad..b78e5e9 100644
--- a/chrome/browser/task_manager/task_manager_resource_providers.cc
+++ b/chrome/browser/task_manager/task_manager_resource_providers.cc
@@ -9,6 +9,7 @@
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/command_line.h"
+#include "base/debug/alias.h"
#include "base/file_version_info.h"
#include "base/i18n/rtl.h"
#include "base/memory/scoped_ptr.h"
@@ -183,7 +184,8 @@ bool IsContentsBackgroundPrinted(WebContents* web_contents) {
////////////////////////////////////////////////////////////////////////////////
TaskManagerRendererResource::TaskManagerRendererResource(
base::ProcessHandle process, content::RenderViewHost* render_view_host)
- : process_(process),
+ : content::RenderViewHostObserver(render_view_host),
+ process_(process),
render_view_host_(render_view_host),
pending_stats_update_(false),
fps_(0.0f),
@@ -202,6 +204,18 @@ TaskManagerRendererResource::~TaskManagerRendererResource() {
}
void TaskManagerRendererResource::Refresh() {
+ if (!render_view_host()) {
+ // Store information about where this TaskManagerRendererResource was
+ // created and where the RenderViewHost was destroyed on the stack to help
+ // debugging where we forgot to delete this resource.
+ base::debug::StackTrace creation_stack = creation_stack_;
+ base::debug::Alias(&creation_stack);
+ CHECK(destruction_stack_);
+ base::debug::StackTrace destruction_stack = *destruction_stack_;
+ base::debug::Alias(&destruction_stack);
+ CHECK(false);
+ }
+
if (!pending_stats_update_) {
render_view_host_->Send(new ChromeViewMsg_GetCacheResourceStats);
pending_stats_update_ = true;
@@ -292,6 +306,11 @@ bool TaskManagerRendererResource::SupportNetworkUsage() const {
return true;
}
+void TaskManagerRendererResource::RenderViewHostDestroyed(
+ content::RenderViewHost* render_view_host) {
+ destruction_stack_.reset(new base::debug::StackTrace());
+}
+
////////////////////////////////////////////////////////////////////////////////
// TaskManagerTabContentsResource class
////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/task_manager/task_manager_resource_providers.h b/chrome/browser/task_manager/task_manager_resource_providers.h
index 81d9cdd..e3bb5ba 100644
--- a/chrome/browser/task_manager/task_manager_resource_providers.h
+++ b/chrome/browser/task_manager/task_manager_resource_providers.h
@@ -10,11 +10,13 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
+#include "base/debug/stack_trace.h"
#include "base/process_util.h"
#include "chrome/browser/task_manager/task_manager.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/render_view_host_observer.h"
#include "content/public/common/process_type.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h"
@@ -36,7 +38,8 @@ class Extension;
// Base class for various types of render process resources that provides common
// functionality like stats tracking.
-class TaskManagerRendererResource : public TaskManager::Resource {
+class TaskManagerRendererResource : public TaskManager::Resource,
+ public content::RenderViewHostObserver {
public:
TaskManagerRendererResource(base::ProcessHandle process,
content::RenderViewHost* render_view_host);
@@ -75,6 +78,10 @@ class TaskManagerRendererResource : public TaskManager::Resource {
virtual void NotifyV8HeapStats(size_t v8_memory_allocated,
size_t v8_memory_used) OVERRIDE;
+ // content::RenderViewHostObserver implementation.
+ virtual void RenderViewHostDestroyed(
+ content::RenderViewHost* render_view_host) OVERRIDE;
+
content::RenderViewHost* render_view_host() const {
return render_view_host_;
}
@@ -102,6 +109,10 @@ class TaskManagerRendererResource : public TaskManager::Resource {
size_t v8_memory_used_;
bool pending_v8_memory_allocated_update_;
+ // TODO(jochen): Remove asap after debugging http://crbug.com/165138.
+ base::debug::StackTrace creation_stack_;
+ scoped_ptr<base::debug::StackTrace> destruction_stack_;
+
DISALLOW_COPY_AND_ASSIGN(TaskManagerRendererResource);
};