bool PluginModuleParent::ShouldContinueFromReplyTimeout() { #ifdef MOZ_CRASHREPORTER CrashReporterParent* crashReporter = CrashReporter(); if (crashReporter->GeneratePairedMinidump(this)) { mBrowserDumpID = crashReporter->ParentDumpID(); mPluginDumpID = crashReporter->ChildDumpID(); PLUGIN_LOG_DEBUG( ("generated paired browser/plugin minidumps: %s/%s (ID=%s)", NS_ConvertUTF16toUTF8(mBrowserDumpID).get(), NS_ConvertUTF16toUTF8(mPluginDumpID).get(), NS_ConvertUTF16toUTF8(crashReporter->HangID()).get())); } else { NS_WARNING("failed to capture paired minidumps from hang"); } #endif // this must run before the error notification from the channel, // or not at all MessageLoop::current()->PostTask( FROM_HERE, mTaskFactory.NewRunnableMethod( &PluginModuleParent::CleanupFromTimeout)); if (!KillProcess(OtherProcess(), 1, false)) NS_WARNING("failed to kill subprocess!"); return false; }
void PluginModuleParent::OnCrash(DWORD processID, const nsAString& aDumpID) { if (!mPluginDumpID.IsEmpty()) { // One process has already crashed: we assume that the first-to-crash // is the interesting one return; } mPluginDumpID = aDumpID; CrashReporter::AnnotationTable notes; notes.Init(4); WriteExtraDataForMinidump(notes); notes.Put(NS_LITERAL_CSTRING("ProcessType"), NS_LITERAL_CSTRING("plugin")); if (processID == mFlashProcess1) { notes.Put(NS_LITERAL_CSTRING("FlashProcessDump"), NS_LITERAL_CSTRING("Broker")); } else if (processID == mFlashProcess2) { notes.Put(NS_LITERAL_CSTRING("FlashProcessDump"), NS_LITERAL_CSTRING("Sandbox")); } else { NS_ERROR("Got minidump for Flash process neither broker nor sandbox."); } CrashReporter::AppendExtraData(aDumpID, notes); MessageLoop::current()->PostTask( FROM_HERE, mTaskFactory.NewRunnableMethod( &PluginModuleParent::CleanupFromTimeout)); KillProcess(OtherProcess(), 1, false); }
void PluginModuleParent::OnCrash(DWORD processID) { if (!mShutdown) { GetIPCChannel()->CloseWithError(); KillProcess(OtherProcess(), 1, false); } }
bool PluginModuleParent::ShouldContinueFromReplyTimeout() { #ifdef MOZ_CRASHREPORTER CrashReporterParent* crashReporter = CrashReporter(); crashReporter->AnnotateCrashReport(NS_LITERAL_CSTRING("PluginHang"), NS_LITERAL_CSTRING("1")); if (crashReporter->GeneratePairedMinidump(this)) { mPluginDumpID = crashReporter->ChildDumpID(); PLUGIN_LOG_DEBUG( ("generated paired browser/plugin minidumps: %s)", NS_ConvertUTF16toUTF8(mPluginDumpID).get())); crashReporter->AnnotateCrashReport( NS_LITERAL_CSTRING("additional_minidumps"), NS_LITERAL_CSTRING("browser")); // TODO: collect Flash minidumps here } else { NS_WARNING("failed to capture paired minidumps from hang"); } #endif #ifdef XP_WIN // collect cpu usage for plugin processes InfallibleTArray<base::ProcessHandle> processHandles; base::ProcessHandle handle; processHandles.AppendElement(OtherProcess()); #ifdef MOZ_CRASHREPORTER_INJECTOR if (mFlashProcess1 && base::OpenProcessHandle(mFlashProcess1, &handle)) { processHandles.AppendElement(handle); } if (mFlashProcess2 && base::OpenProcessHandle(mFlashProcess2, &handle)) { processHandles.AppendElement(handle); } #endif if (!GetProcessCpuUsage(processHandles, mPluginCpuUsageOnHang)) { mPluginCpuUsageOnHang.Clear(); } #endif // this must run before the error notification from the channel, // or not at all MessageLoop::current()->PostTask( FROM_HERE, mTaskFactory.NewRunnableMethod( &PluginModuleParent::CleanupFromTimeout)); if (!KillProcess(OtherProcess(), 1, false)) NS_WARNING("failed to kill subprocess!"); return false; }
bool PluginModuleParent::ShouldContinueFromReplyTimeout() { #ifdef MOZ_CRASHREPORTER nsCOMPtr<nsILocalFile> pluginDump; nsCOMPtr<nsILocalFile> browserDump; CrashReporter::ProcessHandle child; #ifdef XP_MACOSX child = mSubprocess->GetChildTask(); #else child = OtherProcess(); #endif if (CrashReporter::CreatePairedMinidumps(child, mPluginThread, &mHangID, getter_AddRefs(pluginDump), getter_AddRefs(browserDump)) && CrashReporter::GetIDFromMinidump(pluginDump, mPluginDumpID) && CrashReporter::GetIDFromMinidump(browserDump, mBrowserDumpID)) { PLUGIN_LOG_DEBUG( ("generated paired browser/plugin minidumps: %s/%s (ID=%s)", NS_ConvertUTF16toUTF8(mBrowserDumpID).get(), NS_ConvertUTF16toUTF8(mPluginDumpID).get(), NS_ConvertUTF16toUTF8(mHangID).get())); } else { NS_WARNING("failed to capture paired minidumps from hang"); } #endif // this must run before the error notification from the channel, // or not at all MessageLoop::current()->PostTask( FROM_HERE, mTaskFactory.NewRunnableMethod( &PluginModuleParent::CleanupFromTimeout)); if (!KillProcess(OtherProcess(), 1, false)) NS_WARNING("failed to kill subprocess!"); return false; }
void ContentParent::ProcessingError(Result what) { if (MsgDropped == what) { // Messages sent after crashes etc. are not a big deal. return; } // Other errors are big deals. This ensures the process is // eventually killed, but doesn't immediately KILLITWITHFIRE // because we want to get a minidump if possible. After a timeout // though, the process is forceably killed. if (!KillProcess(OtherProcess(), 1, false)) { NS_WARNING("failed to kill subprocess!"); } XRE_GetIOMessageLoop()->PostTask( FROM_HERE, NewRunnableFunction(&ProcessWatcher::EnsureProcessTerminated, OtherProcess(), /*force=*/true)); }