diff --git a/BUILD.gn b/BUILD.gn index 381271a8..98218af1 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -42,10 +42,10 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { "test:test_test", ] if (!crashpad_is_ios) { - deps += [ - "handler:handler_test", - "snapshot:snapshot_test", - ] + deps += [ "snapshot:snapshot_test" ] + } + if (!crashpad_is_ios && !crashpad_is_fuchsia) { + deps += [ "handler:handler_test" ] } if (crashpad_is_in_fuchsia) { # TODO(fuchsia:46559): Fix the leaks and remove this. @@ -182,7 +182,7 @@ if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) { "handler:handler_test", "test:gtest_main", ] - if (crashpad_is_ios) { + if (crashpad_is_ios || crashpad_is_fuchsia) { deps -= [ "handler:handler_test" ] } } diff --git a/client/BUILD.gn b/client/BUILD.gn index 11ba757b..b748c3fe 100644 --- a/client/BUILD.gn +++ b/client/BUILD.gn @@ -163,7 +163,7 @@ source_set("client_test") { "../util", ] - if (!crashpad_is_ios) { + if (!crashpad_is_ios && !crashpad_is_fuchsia) { data_deps = [ "../handler:crashpad_handler" ] } diff --git a/handler/BUILD.gn b/handler/BUILD.gn index 2f608cb1..17c4cbd6 100644 --- a/handler/BUILD.gn +++ b/handler/BUILD.gn @@ -65,15 +65,6 @@ static_library("handler") { ] } - if (crashpad_is_fuchsia) { - sources += [ - "fuchsia/crash_report_exception_handler.cc", - "fuchsia/crash_report_exception_handler.h", - "fuchsia/exception_handler_server.cc", - "fuchsia/exception_handler_server.h", - ] - } - public_configs = [ "..:crashpad_config" ] public_deps = [ @@ -91,10 +82,6 @@ static_library("handler") { if (crashpad_is_win) { cflags = [ "/wd4201" ] # nonstandard extension used : nameless struct/union } - - if (crashpad_is_fuchsia) { - deps += [ "../third_party/fuchsia" ] - } } if (crashpad_is_android) { diff --git a/handler/fuchsia/crash_report_exception_handler.cc b/handler/fuchsia/crash_report_exception_handler.cc deleted file mode 100644 index ad846d29..00000000 --- a/handler/fuchsia/crash_report_exception_handler.cc +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2017 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 "handler/fuchsia/crash_report_exception_handler.h" - -#include -#include -#include -#include - -#include "base/fuchsia/fuchsia_logging.h" -#include "client/settings.h" -#include "minidump/minidump_file_writer.h" -#include "minidump/minidump_user_extension_stream_data_source.h" -#include "snapshot/fuchsia/process_snapshot_fuchsia.h" -#include "util/fuchsia/koid_utilities.h" -#include "util/fuchsia/scoped_task_suspend.h" - -namespace crashpad { - -CrashReportExceptionHandler::CrashReportExceptionHandler( - CrashReportDatabase* database, - CrashReportUploadThread* upload_thread, - const std::map* process_annotations, - const std::map* process_attachments, - const UserStreamDataSources* user_stream_data_sources) - : database_(database), - upload_thread_(upload_thread), - process_annotations_(process_annotations), - process_attachments_(process_attachments), - user_stream_data_sources_(user_stream_data_sources) {} - -CrashReportExceptionHandler::~CrashReportExceptionHandler() {} - -bool CrashReportExceptionHandler::HandleException(const zx::process& process, - const zx::thread& thread, - UUID* local_report_id) { - ScopedTaskSuspend suspend(process); - - ProcessSnapshotFuchsia process_snapshot; - if (!process_snapshot.Initialize(process)) { - return false; - } - - CrashpadInfoClientOptions client_options; - process_snapshot.GetCrashpadOptions(&client_options); - - if (client_options.crashpad_handler_behavior == TriState::kDisabled) { - return true; - } - - zx_exception_report_t report; - zx_status_t status = thread.get_info(ZX_INFO_THREAD_EXCEPTION_REPORT, - &report, - sizeof(report), - nullptr, - nullptr); - if (status != ZX_OK) { - ZX_LOG(ERROR, status) - << "zx_object_get_info ZX_INFO_THREAD_EXCEPTION_REPORT"; - return false; - } - - zx_koid_t thread_id = GetKoidForHandle(thread); - if (!process_snapshot.InitializeException(thread_id, report)) { - return false; - } - - UUID client_id; - Settings* const settings = database_->GetSettings(); - if (settings) { - // If GetSettings() or GetClientID() fails, something else will log a - // message and client_id will be left at its default value, all zeroes, - // which is appropriate. - settings->GetClientID(&client_id); - } - - process_snapshot.SetClientID(client_id); - process_snapshot.SetAnnotationsSimpleMap(*process_annotations_); - - std::unique_ptr new_report; - CrashReportDatabase::OperationStatus database_status = - database_->PrepareNewCrashReport(&new_report); - if (database_status != CrashReportDatabase::kNoError) { - return false; - } - - process_snapshot.SetReportID(new_report->ReportID()); - - MinidumpFileWriter minidump; - minidump.InitializeFromSnapshot(&process_snapshot); - AddUserExtensionStreams( - user_stream_data_sources_, &process_snapshot, &minidump); - - if (!minidump.WriteEverything(new_report->Writer())) { - return false; - } - - if (process_attachments_) { - // Note that attachments are read at this point each time rather than once - // so that if the contents of the VMO has changed it will be re-read for - // each upload (e.g. in the case of a log file). - for (const auto& it : *process_attachments_) { - // TODO(frousseau): make FileWriter VMO-aware. - FileWriter* writer = new_report->AddAttachment(it.first); - if (!writer) { - continue; - } - auto data = std::make_unique(it.second.size); - const zx_status_t read_status = - it.second.vmo.read(data.get(), 0u, it.second.size); - if (read_status != ZX_OK) { - ZX_LOG(ERROR, read_status) - << "could not read VMO for attachment " << it.first; - // Not being able to read the VMO isn't considered fatal, and - // should not prevent the report from being processed. - continue; - } - writer->Write(data.get(), it.second.size); - } - } - - UUID uuid; - database_status = - database_->FinishedWritingCrashReport(std::move(new_report), &uuid); - if (database_status != CrashReportDatabase::kNoError) { - return false; - } - if (local_report_id != nullptr) { - *local_report_id = uuid; - } - - if (upload_thread_) { - upload_thread_->ReportPending(uuid); - } - - return true; -} - -} // namespace crashpad diff --git a/handler/fuchsia/crash_report_exception_handler.h b/handler/fuchsia/crash_report_exception_handler.h deleted file mode 100644 index 06c432f7..00000000 --- a/handler/fuchsia/crash_report_exception_handler.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2017 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_HANDLER_FUCHSIA_CRASH_REPORT_EXCEPTION_HANDLER_H_ -#define CRASHPAD_HANDLER_FUCHSIA_CRASH_REPORT_EXCEPTION_HANDLER_H_ - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "client/crash_report_database.h" -#include "handler/crash_report_upload_thread.h" -#include "handler/user_stream_data_source.h" -#include "util/misc/uuid.h" - -namespace crashpad { - -//! \brief An exception handler that writes crash reports for exception messages -//! to a CrashReportDatabase. -class CrashReportExceptionHandler { - public: - //! \brief Creates a new object that will store crash reports in \a database. - //! - //! \param[in] database The database to store crash reports in. Weak. - //! \param[in] upload_thread The upload thread to notify when a new crash - //! report is written into \a database. - //! \param[in] process_annotations A map of annotations to insert as - //! process-level annotations into each crash report that is written. Do - //! not confuse this with module-level annotations, which are under the - //! control of the crashing process, and are used to implement Chrome's - //! "crash keys." Process-level annotations are those that are beyond the - //! control of the crashing process, which must reliably be set even if - //! the process crashes before it’s able to establish its own annotations. - //! To interoperate with Breakpad servers, the recommended practice is to - //! specify values for the `"prod"` and `"ver"` keys as process - //! annotations. - //! \param[in] process_attachments A map of keys to VMOs to be included in the - //! report. Each time a report is written, the VMOs will be read in their - //! entirety and included in the report using the key as the name in the - //! http upload. - //! \param[in] user_stream_data_sources Data sources to be used to extend - //! crash reports. For each crash report that is written, the data sources - //! are called in turn. These data sources may contribute additional - //! minidump streams. `nullptr` if not required. - CrashReportExceptionHandler( - CrashReportDatabase* database, - CrashReportUploadThread* upload_thread, - const std::map* process_annotations, - const std::map* process_attachments, - const UserStreamDataSources* user_stream_data_sources); - - ~CrashReportExceptionHandler(); - - //! \brief Called when the exception handler server has caught an exception - //! and wants a crash dump to be taken. - //! - //! \param[in] process The handle to the process which sustained the - //! exception. - //! \param[in] thread The handle to the thread of \a process which sustained - //! the exception. - //! \param[out] local_report_id The unique identifier for the report created - //! in the local report database. Optional. - //! \return `true` on success, or `false` with an error logged. - bool HandleException(const zx::process& process, - const zx::thread& thread, - UUID* local_report_id = nullptr); - - private: - CrashReportDatabase* database_; // weak - CrashReportUploadThread* upload_thread_; // weak - const std::map* process_annotations_; // weak - const std::map* - process_attachments_; // weak - const UserStreamDataSources* user_stream_data_sources_; // weak - - DISALLOW_COPY_AND_ASSIGN(CrashReportExceptionHandler); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_FUCHSIA_CRASH_REPORT_EXCEPTION_HANDLER_H_ diff --git a/handler/fuchsia/exception_handler_server.cc b/handler/fuchsia/exception_handler_server.cc deleted file mode 100644 index e468fe3b..00000000 --- a/handler/fuchsia/exception_handler_server.cc +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2017 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 "handler/fuchsia/exception_handler_server.h" - -#include -#include -#include - -#include - -#include "base/fuchsia/fuchsia_logging.h" -#include "base/logging.h" -#include "handler/fuchsia/crash_report_exception_handler.h" - -namespace crashpad { - -ExceptionHandlerServer::ExceptionHandlerServer(zx::job root_job, - zx::channel exception_channel) - : root_job_(std::move(root_job)), - exception_channel_(std::move(exception_channel)) {} - -ExceptionHandlerServer::~ExceptionHandlerServer() = default; - -void ExceptionHandlerServer::Run(CrashReportExceptionHandler* handler) { - while (true) { - zx_signals_t signals; - zx_status_t status = exception_channel_.wait_one( - ZX_CHANNEL_READABLE | ZX_CHANNEL_PEER_CLOSED, - zx::time::infinite(), - &signals); - if (status != ZX_OK) { - ZX_LOG(ERROR, status) << "zx_port_wait, aborting"; - return; - } - - if (signals & ZX_CHANNEL_READABLE) { - zx_exception_info_t info; - zx::exception exception; - status = exception_channel_.read(0, - &info, - exception.reset_and_get_address(), - sizeof(info), - 1, - nullptr, - nullptr); - if (status != ZX_OK) { - ZX_LOG(ERROR, status) << "zx_channel_read, aborting"; - return; - } - - zx::process process; - status = exception.get_process(&process); - if (status != ZX_OK) { - ZX_LOG(ERROR, status) << "zx_exception_get_process, aborting"; - return; - } - - zx::thread thread; - status = exception.get_thread(&thread); - if (status != ZX_OK) { - ZX_LOG(ERROR, status) << "zx_exception_get_thread, aborting"; - return; - } - - bool result = - handler->HandleException(std::move(process), std::move(thread)); - if (!result) { - LOG(ERROR) << "HandleException failed"; - } - } else { - // Job terminated, exit the loop. - return; - } - } -} - -} // namespace crashpad diff --git a/handler/fuchsia/exception_handler_server.h b/handler/fuchsia/exception_handler_server.h deleted file mode 100644 index 85a7b7bd..00000000 --- a/handler/fuchsia/exception_handler_server.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2017 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_HANDLER_FUCHSIA_EXCEPTION_HANDLER_SERVER_H_ -#define CRASHPAD_HANDLER_FUCHSIA_EXCEPTION_HANDLER_SERVER_H_ - -#include -#include - -#include "base/macros.h" - -namespace crashpad { - -class CrashReportExceptionHandler; - -//! \brief Runs the main exception-handling server in Crashpad's handler -//! process. -class ExceptionHandlerServer { - public: - //! \brief Constructs an ExceptionHandlerServer object. - //! - //! \param[in] root_job The root of the tree of processes that will be handled - //! by this server. It is assumed that \a exception_channel is the - // exception channel of this job. - //! \param[in] exception_channel The exception channel that this server will - //! monitor. - ExceptionHandlerServer(zx::job root_job, zx::channel exception_channel); - ~ExceptionHandlerServer(); - - //! \brief Runs the exception-handling server. - //! - //! \param[in] handler The handler to which the exceptions are delegated when - //! they are caught in Run(). Ownership is not transferred. - void Run(CrashReportExceptionHandler* handler); - - private: - zx::job root_job_; - zx::channel exception_channel_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServer); -}; - -} // namespace crashpad - -#endif // CRASHPAD_HANDLER_FUCHSIA_EXCEPTION_HANDLER_SERVER_H_ diff --git a/handler/handler_main.cc b/handler/handler_main.cc index 69da0f61..d56857ff 100644 --- a/handler/handler_main.cc +++ b/handler/handler_main.cc @@ -86,15 +86,6 @@ #include "util/win/handle.h" #include "util/win/initial_client_data.h" #include "util/win/session_end_watcher.h" -#elif defined(OS_FUCHSIA) -#include -#include - -#include -#include - -#include "handler/fuchsia/crash_report_exception_handler.h" -#include "handler/fuchsia/exception_handler_server.h" #elif defined(OS_LINUX) #include "handler/linux/crash_report_exception_handler.h" #include "handler/linux/exception_handler_server.h" @@ -420,22 +411,6 @@ void InstallCrashHandler() { ALLOW_UNUSED_LOCAL(terminate_handler); } -#elif defined(OS_FUCHSIA) - -void InstallCrashHandler() { - // There's nothing to do here. Crashes in this process will already be caught - // here because this handler process is in the same job that has had its - // exception port bound. - - // TODO(scottmg): This should collect metrics on handler crashes, at a - // minimum. https://crashpad.chromium.org/bug/230. -} - -void ReinstallCrashHandler() { - // TODO(scottmg): Fuchsia: https://crashpad.chromium.org/bug/196 - NOTREACHED(); -} - #endif // OS_MACOSX void MonitorSelf(const Options& options) { @@ -1013,10 +988,6 @@ int HandlerMain(int argc, database.get(), static_cast(upload_thread.Get()), &options.annotations, -#if defined(OS_FUCHSIA) - // TODO(scottmg): Process level file attachments, and for all platforms. - nullptr, -#endif #if defined(OS_ANDROID) options.write_minidump_to_database, options.write_minidump_to_log, @@ -1100,26 +1071,6 @@ int HandlerMain(int argc, if (!options.pipe_name.empty()) { exception_handler_server.SetPipeName(base::UTF8ToUTF16(options.pipe_name)); } -#elif defined(OS_FUCHSIA) - // These handles are logically "moved" into these variables when retrieved by - // zx_take_startup_handle(). Both are given to ExceptionHandlerServer which - // owns them in this process. There is currently no "connect-later" mode on - // Fuchsia, all the binding must be done by the client before starting - // crashpad_handler. - zx::job root_job(zx_take_startup_handle(PA_HND(PA_USER0, 0))); - if (!root_job.is_valid()) { - LOG(ERROR) << "no job handle passed in startup handle 0"; - return EXIT_FAILURE; - } - - zx::channel exception_channel(zx_take_startup_handle(PA_HND(PA_USER0, 1))); - if (!exception_channel.is_valid()) { - LOG(ERROR) << "no exception channel handle passed in startup handle 1"; - return EXIT_FAILURE; - } - - ExceptionHandlerServer exception_handler_server(std::move(root_job), - std::move(exception_channel)); #elif defined(OS_LINUX) || defined(OS_ANDROID) ExceptionHandlerServer exception_handler_server; #endif // OS_MACOSX diff --git a/third_party/fuchsia/BUILD.gn b/third_party/fuchsia/BUILD.gn index 7c1efd92..7e06289c 100644 --- a/third_party/fuchsia/BUILD.gn +++ b/third_party/fuchsia/BUILD.gn @@ -19,13 +19,11 @@ if (crashpad_is_in_fuchsia) { public_deps = [ "//zircon/public/lib/fdio", "//zircon/public/lib/zx", - "//zircon/system/fidl/fuchsia-mem", ] } } else if (crashpad_is_in_chromium) { group("fuchsia") { public_deps = [ - "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.mem", "//third_party/fuchsia-sdk/sdk/pkg/fdio", "//third_party/fuchsia-sdk/sdk/pkg/zx", ] @@ -33,7 +31,6 @@ if (crashpad_is_in_fuchsia) { } else { group("fuchsia") { public_deps = [ - "//third_party/fuchsia/sdk/$host_os-amd64/fidl/fuchsia.mem", "//third_party/fuchsia/sdk/$host_os-amd64/pkg/fdio", "//third_party/fuchsia/sdk/$host_os-amd64/pkg/zx", ]