Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Side by Side Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 2387113004: Better bad message reporting from IO thread (Closed)
Patch Set: cleanup Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Represents the browser side of the browser <--> renderer communication 5 // Represents the browser side of the browser <--> renderer communication
6 // channel. There will be one RenderProcessHost per renderer process. 6 // channel. There will be one RenderProcessHost per renderer process.
7 7
8 #include "content/browser/renderer_host/render_process_host_impl.h" 8 #include "content/browser/renderer_host/render_process_host_impl.h"
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 cmd_line->PrependWrapper(renderer_prefix); 965 cmd_line->PrependWrapper(renderer_prefix);
966 AppendRendererCommandLine(cmd_line); 966 AppendRendererCommandLine(cmd_line);
967 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id); 967 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id);
968 968
969 // Spawn the child process asynchronously to avoid blocking the UI thread. 969 // Spawn the child process asynchronously to avoid blocking the UI thread.
970 // As long as there's no renderer prefix, we can use the zygote process 970 // As long as there's no renderer prefix, we can use the zygote process
971 // at this stage. 971 // at this stage.
972 child_process_launcher_.reset(new ChildProcessLauncher( 972 child_process_launcher_.reset(new ChildProcessLauncher(
973 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line, 973 new RendererSandboxedProcessLauncherDelegate(channel_.get()), cmd_line,
974 GetID(), this, child_token_, 974 GetID(), this, child_token_,
975 base::Bind(&RenderProcessHostImpl::OnMojoError, 975 base::Bind(&RenderProcessHostImpl::OnMojoError, id_)));
976 weak_factory_.GetWeakPtr(),
977 base::ThreadTaskRunnerHandle::Get())));
978 channel_->Pause(); 976 channel_->Pause();
979 977
980 fast_shutdown_started_ = false; 978 fast_shutdown_started_ = false;
981 } 979 }
982 980
983 // Push any pending messages to the channel now. Note that if the child 981 // Push any pending messages to the channel now. Note that if the child
984 // process is still launching, the channel will be paused and outgoing 982 // process is still launching, the channel will be paused and outgoing
985 // messages will be queued internally by the channel. 983 // messages will be queued internally by the channel.
986 while (!queued_messages_.empty()) { 984 while (!queued_messages_.empty()) {
987 channel_->Send(queued_messages_.front().release()); 985 channel_->Send(queued_messages_.front().release());
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
1456 1454
1457 void RenderProcessHostImpl::AddObserver(RenderProcessHostObserver* observer) { 1455 void RenderProcessHostImpl::AddObserver(RenderProcessHostObserver* observer) {
1458 observers_.AddObserver(observer); 1456 observers_.AddObserver(observer);
1459 } 1457 }
1460 1458
1461 void RenderProcessHostImpl::RemoveObserver( 1459 void RenderProcessHostImpl::RemoveObserver(
1462 RenderProcessHostObserver* observer) { 1460 RenderProcessHostObserver* observer) {
1463 observers_.RemoveObserver(observer); 1461 observers_.RemoveObserver(observer);
1464 } 1462 }
1465 1463
1466 void RenderProcessHostImpl::ShutdownForBadMessage() { 1464 void RenderProcessHostImpl::ShutdownForBadMessage(
1465 CrashReportMode crash_report_mode) {
1467 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 1466 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
1468 if (command_line->HasSwitch(switches::kDisableKillAfterBadIPC)) 1467 if (command_line->HasSwitch(switches::kDisableKillAfterBadIPC))
1469 return; 1468 return;
1470 1469
1471 if (run_renderer_in_process()) { 1470 if (run_renderer_in_process()) {
1472 // In single process mode it is better if we don't suicide but just 1471 // In single process mode it is better if we don't suicide but just
1473 // crash. 1472 // crash.
1474 CHECK(false); 1473 CHECK(false);
1475 } 1474 }
1476 1475
1477 // We kill the renderer but don't include a NOTREACHED, because we want the 1476 // We kill the renderer but don't include a NOTREACHED, because we want the
1478 // browser to try to survive when it gets illegal messages from the renderer. 1477 // browser to try to survive when it gets illegal messages from the renderer.
1479 Shutdown(RESULT_CODE_KILLED_BAD_MESSAGE, false); 1478 Shutdown(RESULT_CODE_KILLED_BAD_MESSAGE, false);
1480 1479
1481 // Report a crash, since none will be generated by the killed renderer. 1480 if (crash_report_mode == CrashReportMode::GENERATE_CRASH_DUMP) {
1482 base::debug::DumpWithoutCrashing(); 1481 // Report a crash, since none will be generated by the killed renderer.
1482 base::debug::DumpWithoutCrashing();
1483 }
1483 1484
1484 // Log the renderer kill to the histogram tracking all kills. 1485 // Log the renderer kill to the histogram tracking all kills.
1485 BrowserChildProcessHostImpl::HistogramBadMessageTerminated( 1486 BrowserChildProcessHostImpl::HistogramBadMessageTerminated(
1486 PROCESS_TYPE_RENDERER); 1487 PROCESS_TYPE_RENDERER);
1487 } 1488 }
1488 1489
1489 void RenderProcessHostImpl::WidgetRestored() { 1490 void RenderProcessHostImpl::WidgetRestored() {
1490 visible_widgets_++; 1491 visible_widgets_++;
1491 UpdateProcessPriority(); 1492 UpdateProcessPriority();
1492 DCHECK(!is_process_backgrounded_); 1493 DCHECK(!is_process_backgrounded_);
(...skipping 1531 matching lines...) Expand 10 before | Expand all | Expand 10 after
3024 3025
3025 // Skip widgets in other processes. 3026 // Skip widgets in other processes.
3026 if (rvh->GetProcess()->GetID() != GetID()) 3027 if (rvh->GetProcess()->GetID() != GetID())
3027 continue; 3028 continue;
3028 3029
3029 rvh->OnWebkitPreferencesChanged(); 3030 rvh->OnWebkitPreferencesChanged();
3030 } 3031 }
3031 } 3032 }
3032 3033
3033 // static 3034 // static
3034 void RenderProcessHostImpl::OnMojoError( 3035 void RenderProcessHostImpl::OnMojoError(int render_process_id,
3035 base::WeakPtr<RenderProcessHostImpl> process, 3036 const std::string& error) {
3036 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
3037 const std::string& error) {
3038 if (!task_runner->BelongsToCurrentThread()) {
3039 task_runner->PostTask(FROM_HERE,
3040 base::Bind(&RenderProcessHostImpl::OnMojoError,
3041 process, task_runner, error));
3042 return;
3043 }
3044 if (!process)
3045 return;
3046 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; 3037 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error;
3047 3038
3048 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias 3039 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. Alias
3049 // enough information here so that we can determine what the bad message was. 3040 // enough information here so that we can determine what the bad message was.
3050 base::debug::Alias(&error); 3041 base::debug::Alias(&error);
3051 bad_message::ReceivedBadMessage(process.get(), 3042 bad_message::ReceivedBadMessage(render_process_id,
3052 bad_message::RPH_MOJO_PROCESS_ERROR); 3043 bad_message::RPH_MOJO_PROCESS_ERROR);
3053 } 3044 }
3054 3045
3055 } // namespace content 3046 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698