crashpad/util/win/scoped_process_suspend.h
Mark Mentovai c6adcc2482 win: Make CrashpadClient::DumpAndCrashTargetProcess() less chatty
CrashpadClient::DumpAndCrashTargetProcess() suspends the target process
and injects a thread to raise an exception. The injected thread is not
suspended, and may proceed to the point that the system recognizes the
process as terminating by the time the overall process suspension is
lifted. Previously, if this happened, an extraneous error was logged for
the attempt to resume a terminating process.

This introduces “termination tolerance” to ScopedProcessSuspend, which
allows an object to be configured to ignore this error and not log any
messages when this condition is expected.

This resolves log messages such as this one, produced frequently during
calls to CrashpadClient::DumpAndCrashTargetProcess() (including in
end_to_end_test.py):

> [pid:tid:yyyymmdd,hhmmss.mmm:ERROR scoped_process_suspend.cc:39]
> NtResumeProcess: An attempt was made to access an exiting process.
> (0xc000010a)

0xc000010a = STATUS_PROCESS_IS_TERMINATING

Test: end_to_end_test.py
Change-Id: Iab4c50fb21adce5502080ad25a6f734ec566d65c
Reviewed-on: https://chromium-review.googlesource.com/700715
Commit-Queue: Mark Mentovai <mark@chromium.org>
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-10-04 19:04:47 +00:00

57 lines
1.9 KiB
C++

// Copyright 2015 The Crashpad Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef CRASHPAD_UTIL_WIN_SCOPED_PROCESS_SUSPEND_H_
#define CRASHPAD_UTIL_WIN_SCOPED_PROCESS_SUSPEND_H_
#include <windows.h>
#include "base/macros.h"
namespace crashpad {
//! \brief Manages the suspension of another process.
//!
//! While an object of this class exists, the other process will be suspended.
//! Once the object is destroyed, the other process will become eligible for
//! resumption.
//!
//! If this process crashes while this object exists, there is no guarantee that
//! the other process will be resumed.
class ScopedProcessSuspend {
public:
//! Does not take ownership of \a process.
explicit ScopedProcessSuspend(HANDLE process);
~ScopedProcessSuspend();
//! \brief Informs the object that the suspended process may be terminating,
//! and that this should not be treated as an error.
//!
//! Normally, attempting to resume a terminating process during destruction
//! results in an error message being logged for
//! `STATUS_PROCESS_IS_TERMINATING`. When it is known that a process may be
//! terminating, this method may be called to suppress that error message.
void TolerateTermination();
private:
HANDLE process_;
bool tolerate_termination_ = false;
DISALLOW_COPY_AND_ASSIGN(ScopedProcessSuspend);
};
} // namespace crashpad
#endif // CRASHPAD_UTIL_WIN_SCOPED_PROCESS_SUSPEND_H_