Bug 1178998 - Identify which hang detector reports a hang. r=billm

This commit is contained in:
Jim Mathies 2015-07-06 12:39:25 -05:00
parent 39d0eb3c1f
commit a10d0c34c0
5 changed files with 28 additions and 8 deletions

View File

@ -817,7 +817,8 @@ HangMonitoredProcess::TerminatePlugin()
}
uint32_t id = mHangData.get_PluginHangData().pluginId();
plugins::TerminatePlugin(id, mBrowserDumpId);
plugins::TerminatePlugin(id, NS_LITERAL_CSTRING("HangMonitor"),
mBrowserDumpId);
if (mActor) {
mActor->CleanupPluginHang(id, false);

View File

@ -25,7 +25,9 @@ FindPluginsForContent(uint32_t aPluginEpoch,
uint32_t* aNewPluginEpoch);
void
TerminatePlugin(uint32_t aPluginId, const nsString& aBrowserDumpId);
TerminatePlugin(uint32_t aPluginId,
const nsCString& aMonitorDescription,
const nsAString& aBrowserDumpId);
} // namespace plugins
} // namespace mozilla

View File

@ -353,7 +353,9 @@ PluginHangUIParent::RecvUserResponse(const unsigned int& aResponse)
int responseCode;
if (aResponse & HANGUI_USER_RESPONSE_STOP) {
// User clicked Stop
mModule->TerminateChildProcess(mMainThreadMessageLoop, EmptyString());
mModule->TerminateChildProcess(mMainThreadMessageLoop,
NS_LITERAL_CSTRING("ModalHangUI"),
EmptyString());
responseCode = 1;
} else if(aResponse & HANGUI_USER_RESPONSE_CONTINUE) {
mModule->OnHangUIContinue();

View File

@ -350,7 +350,9 @@ bool PluginModuleMapping::sIsLoadModuleOnStack = false;
} // anonymous namespace
void
mozilla::plugins::TerminatePlugin(uint32_t aPluginId, const nsString& aBrowserDumpId)
mozilla::plugins::TerminatePlugin(uint32_t aPluginId,
const nsCString& aMonitorDescription,
const nsAString& aBrowserDumpId)
{
MOZ_ASSERT(XRE_IsParentProcess());
@ -360,8 +362,11 @@ mozilla::plugins::TerminatePlugin(uint32_t aPluginId, const nsString& aBrowserDu
return;
}
nsRefPtr<nsNPAPIPlugin> plugin = pluginTag->mPlugin;
PluginModuleChromeParent* chromeParent = static_cast<PluginModuleChromeParent*>(plugin->GetLibrary());
chromeParent->TerminateChildProcess(MessageLoop::current(), aBrowserDumpId);
PluginModuleChromeParent* chromeParent =
static_cast<PluginModuleChromeParent*>(plugin->GetLibrary());
chromeParent->TerminateChildProcess(MessageLoop::current(),
aMonitorDescription,
aBrowserDumpId);
}
/* static */ PluginLibrary*
@ -1154,7 +1159,9 @@ PluginModuleChromeParent::ShouldContinueFromReplyTimeout()
// original plugin hang behaviour and kill the plugin container.
FinishHangUI();
#endif // XP_WIN
TerminateChildProcess(MessageLoop::current(), EmptyString());
TerminateChildProcess(MessageLoop::current(),
NS_LITERAL_CSTRING("ModalHangUI"),
EmptyString());
GetIPCChannel()->CloseWithTimeout();
return false;
}
@ -1178,6 +1185,7 @@ PluginModuleContentParent::OnExitedSyncSend()
void
PluginModuleChromeParent::TerminateChildProcess(MessageLoop* aMsgLoop,
const nsCString& aMonitorDescription,
const nsAString& aBrowserDumpId)
{
#ifdef MOZ_CRASHREPORTER
@ -1194,6 +1202,8 @@ PluginModuleChromeParent::TerminateChildProcess(MessageLoop* aMsgLoop,
#endif
crashReporter->AnnotateCrashReport(NS_LITERAL_CSTRING("PluginHang"),
NS_LITERAL_CSTRING("1"));
crashReporter->AnnotateCrashReport(NS_LITERAL_CSTRING("HangMonitorDescription"),
aMonitorDescription);
#ifdef XP_WIN
if (mHangUIParent) {
unsigned int hangUIDuration = mHangUIParent->LastShowDurationMs();

View File

@ -386,12 +386,17 @@ class PluginModuleChromeParent
*
* @param aMsgLoop the main message pump associated with the module
* protocol.
* @param aMonitorDescription a string describing the hang monitor that
* is making this call. This string is added to the crash reporter
* annotations for the plugin process.
* @param aBrowserDumpId (optional) previously taken browser dump id. If
* provided TerminateChildProcess will use this browser dump file in
* generating a multi-process crash report. If not provided a browser
* dump will be taken at the time of this call.
*/
void TerminateChildProcess(MessageLoop* aMsgLoop, const nsAString& aBrowserDumpId);
void TerminateChildProcess(MessageLoop* aMsgLoop,
const nsCString& aMonitorDescription,
const nsAString& aBrowserDumpId);
#ifdef XP_WIN
/**