| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. |
| |
| #include <fuchsia/exception/cpp/fidl.h> |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/async-loop/default.h> |
| #include <lib/fidl/cpp/binding_set.h> |
| #include <lib/sys/cpp/component_context.h> |
| #include <lib/syslog/cpp/macros.h> |
| #include <zircon/status.h> |
| |
| #include "src/lib/fsl/handles/object_info.h" |
| |
| // Simple application that obtains the Process Limbo services and obtains the exceptions from it. |
| // Meant to be called manually for testing purposes. |
| |
| namespace { |
| |
| std::string GetProcessName(const fuchsia::exception::ProcessExceptionMetadata& pe) { |
| if (pe.has_process()) |
| return fsl::GetObjectName(pe.process().get()); |
| return {}; |
| } |
| |
| std::string GetThreadName(const fuchsia::exception::ProcessExceptionMetadata& pe) { |
| if (pe.has_thread()) |
| return fsl::GetObjectName(pe.thread().get()); |
| return {}; |
| } |
| |
| } // namespace |
| |
| int main() { |
| auto environment_services = sys::ServiceDirectory::CreateFromNamespace(); |
| |
| fuchsia::exception::ProcessLimboSyncPtr process_limbo; |
| environment_services->Connect(process_limbo.NewRequest()); |
| |
| fuchsia::exception::ProcessLimbo_WatchProcessesWaitingOnException_Result result; |
| zx_status_t status = process_limbo->WatchProcessesWaitingOnException(&result); |
| FX_DCHECK(status == ZX_OK) << zx_status_get_string(status); |
| FX_DCHECK(result.is_response()) << zx_status_get_string(result.err()); |
| |
| auto& exceptions = result.response().exception_list; |
| printf("Got %zu exceptions.\n", exceptions.size()); |
| fflush(stdout); |
| for (auto& pe : exceptions) { |
| auto process_name = GetProcessName(pe); |
| auto thread_name = GetThreadName(pe); |
| printf("Exception! Process %s, Thread %s\n", process_name.c_str(), thread_name.c_str()); |
| fflush(stdout); |
| } |
| } |