mirror of
https://github.com/chromium/crashpad.git
synced 2025-01-07 12:25:18 +08:00
ae1ccf621b
The handler is now capable of uploading crash reports from the database. At present, only one upload attempt is made, and the report will be moved to “completed” in the database after the attempt, regardless of whether it succeeded or failed. The handler also has support to push annotations from its command line into the process annotations map of each crash report it writes. This is intended to set basic information about each crash report, such as the product ID and version. Each potentially crashy process can’t be relied on to maintain this information on their own. With this change, Crashpad is now 100% capable of running a handler that maintains a database and uploads crash reports to a Breakpad-type server such that Breakpad properly interprets the reports. This is all possible from the command line. TEST=run_with_crashpad --handler crashpad_handler \ -a --database=/tmp/crashpad_db \ -a --url=https://clients2.google.com/cr/staging_report \ -a --annotation=prod=crashpad \ -a --annotation=ver=0.6.0 \ crashy_program R=rsesek@chromium.org Review URL: https://codereview.chromium.org/982613002
101 lines
2.7 KiB
C++
101 lines
2.7 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.
|
||
|
||
#include "util/file/file_reader.h"
|
||
|
||
#include "base/logging.h"
|
||
#include "base/numerics/safe_conversions.h"
|
||
|
||
namespace crashpad {
|
||
|
||
bool FileReaderInterface::ReadExactly(void* data, size_t size) {
|
||
ssize_t expect = base::checked_cast<ssize_t>(size);
|
||
ssize_t rv = Read(data, size);
|
||
if (rv < 0) {
|
||
// Read() will have logged its own error.
|
||
return false;
|
||
} else if (rv != expect) {
|
||
LOG(ERROR) << "ReadExactly(): expected " << expect << ", observed " << rv;
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
WeakFileHandleFileReader::WeakFileHandleFileReader(FileHandle file_handle)
|
||
: file_handle_(file_handle) {
|
||
}
|
||
|
||
WeakFileHandleFileReader::~WeakFileHandleFileReader() {
|
||
}
|
||
|
||
ssize_t WeakFileHandleFileReader::Read(void* data, size_t size) {
|
||
DCHECK_NE(file_handle_, kInvalidFileHandle);
|
||
|
||
// Don’t use LoggingReadFile(), which insists on a full read and only returns
|
||
// a bool. This method permits short reads and returns the number of bytes
|
||
// read.
|
||
base::checked_cast<ssize_t>(size);
|
||
ssize_t rv = ReadFile(file_handle_, data, size);
|
||
if (rv < 0) {
|
||
PLOG(ERROR) << "read";
|
||
return -1;
|
||
}
|
||
|
||
return rv;
|
||
}
|
||
|
||
FileOffset WeakFileHandleFileReader::Seek(FileOffset offset, int whence) {
|
||
DCHECK_NE(file_handle_, kInvalidFileHandle);
|
||
return LoggingSeekFile(file_handle_, offset, whence);
|
||
}
|
||
|
||
FileReader::FileReader()
|
||
: file_(),
|
||
weak_file_handle_file_reader_(kInvalidFileHandle) {
|
||
}
|
||
|
||
FileReader::~FileReader() {
|
||
}
|
||
|
||
bool FileReader::Open(const base::FilePath& path) {
|
||
CHECK(!file_.is_valid());
|
||
file_.reset(LoggingOpenFileForRead(path));
|
||
if (!file_.is_valid()) {
|
||
return false;
|
||
}
|
||
|
||
weak_file_handle_file_reader_.set_file_handle(file_.get());
|
||
return true;
|
||
}
|
||
|
||
void FileReader::Close() {
|
||
CHECK(file_.is_valid());
|
||
|
||
weak_file_handle_file_reader_.set_file_handle(kInvalidFileHandle);
|
||
file_.reset();
|
||
}
|
||
|
||
ssize_t FileReader::Read(void* data, size_t size) {
|
||
DCHECK(file_.is_valid());
|
||
return weak_file_handle_file_reader_.Read(data, size);
|
||
}
|
||
|
||
FileOffset FileReader::Seek(FileOffset offset, int whence) {
|
||
DCHECK(file_.is_valid());
|
||
return weak_file_handle_file_reader_.Seek(offset, whence);
|
||
}
|
||
|
||
} // namespace crashpad
|