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);
}
Exemple #3
0
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;
}
Exemple #6
0
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));
}