blob: 2e8b681bd9cdf46f3f8e9a8e04d7c2bef1c62e6e [file] [log] [blame]
// Copyright 2017 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.
// A suite of utilities for inspecting processes.
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <zircon/compiler.h>
#include <zircon/syscalls/debug.h>
#include <zircon/syscalls/exception.h>
#include <zircon/types.h>
__BEGIN_CDECLS
// Opaque handle for fetching and using the list of the process's DSOs.
typedef struct inspector_dsoinfo inspector_dsoinfo_t;
// The type of the buffer that holds the general registers, and exception info.
#if defined(__x86_64__)
typedef zx_x86_64_exc_data_t inspector_excp_data_t;
#elif defined(__aarch64__)
typedef zx_arm64_exc_data_t inspector_excp_data_t;
#else // unsupported arch
typedef int inspector_excp_data_t;
#endif
// Set internal verbosity level, for debugging inspector itself.
extern void inspector_set_verbosity(int level);
// Print a backtrace of |thread| to |f|.
// |thread| must currently be stopped: either suspended or in an exception.
// The format of the output is verify specific: It outputs the format
// documented at zircon/docs/symbolizer_markup.md
extern void inspector_print_backtrace_markup(FILE* f,
zx_handle_t process,
zx_handle_t thread,
inspector_dsoinfo_t* dso_list,
uintptr_t pc, uintptr_t sp,
uintptr_t fp, bool use_libunwind);
// Print a backtrace of |thread| to |f|.
// |thread| must currently be stopped: either suspended or in an exception.
// The format of the output is verify specific: It is read by
// zircon/scripts/symbolize in order to add source location to the output.
extern void inspector_print_backtrace(FILE* f,
zx_handle_t process, zx_handle_t thread,
inspector_dsoinfo_t* dso_list,
uintptr_t pc, uintptr_t sp, uintptr_t fp,
bool use_libunwind);
// Fetch the list of the DSOs of |process|.
// |name| is the name of the application binary.
extern inspector_dsoinfo_t* inspector_dso_fetch_list(zx_handle_t process);
// Free the value returned by dso_fetch_list().
extern void inspector_dso_free_list(inspector_dsoinfo_t*);
// Return the DSO that contains |pc|.
// Returns NULL if not found.
extern inspector_dsoinfo_t* inspector_dso_lookup(inspector_dsoinfo_t* dso_list,
zx_vaddr_t pc);
// Print markup context to |f|. This includes every module and every mapped
// region of memory derived from those modules.
void inspector_print_markup_context(FILE* f, zx_handle_t process);
// Print |dso_list| to |f|.
// The format of the output is verify specific: It is read by
// zircon/scripts/symbolize in order to add source location to the output.
extern void inspector_dso_print_list(FILE* f, inspector_dsoinfo_t* dso_list);
// Try to find the copy of |dso| that contains debug information.
// On success returns ZX_OK with the path of the file stored in
// |out_debug_file|. On failure returns an error code.
extern zx_status_t inspector_dso_find_debug_file(inspector_dsoinfo_t* dso,
const char** out_debug_file);
// Fetch the general registers of |thread|.
zx_status_t inspector_read_general_regs(zx_handle_t thread,
zx_thread_state_general_regs_t* regs);
// Print general registers |regs| to |f|.
// If |excp_data| is non-NULL then print useful related exception data
// along with the registers.
void inspector_print_general_regs(FILE* f,
const zx_thread_state_general_regs_t* regs,
const inspector_excp_data_t* excp_data);
// Print the contents of memory, typically the bottom of a thread's stack.
void inspector_print_memory(FILE* f, zx_handle_t process, zx_vaddr_t addr,
size_t length);
// Prints to stdout the debug info (registers, bottom of user stack, dso list,
// backtrace, etc.) of the given |thread| in |process|.
// Does NOT close the handles nor resume the thread.
void inspector_print_debug_info(zx_handle_t process, zx_handle_t thread);
// Same as above except that it resumes the thread from the exception port at
// the end.
void inspector_print_debug_info_and_resume_thread(zx_handle_t process,
zx_handle_t thread,
zx_handle_t exception_port);
__END_CDECLS