/** * Copyright (C) Mellanox Technologies Ltd. 2001-2014. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #ifndef UCS_DEBUG_H_ #define UCS_DEBUG_H_ #include #include #include #include /** * Information about an address in the code. */ typedef struct ucs_debug_address_info { struct { char path[512]; /* Binary file path */ unsigned long base; /* Binary file load base */ } file; char function[128]; /* Function name */ char source_file[512]; /* Source file path */ unsigned line_number; /* Line number */ } ucs_debug_address_info_t; typedef struct backtrace *backtrace_h; typedef struct backtrace_line *backtrace_line_h; extern const char *ucs_state_detail_level_names[]; extern const char *ucs_signal_names[]; /** * Initialize UCS debugging subsystem. */ void ucs_debug_init(); /** * Cleanup UCS debugging subsystem. */ void ucs_debug_cleanup(int on_error); /** * Disable signal handling in UCS for signal. * Previous signal handler is set. */ void ucs_debug_disable_signal(int signum); /** * Disable signal handling in UCS for all signals * that was set in ucs_global_opts.error_signals. * Previous signal handlers are set. */ void ucs_debug_disable_signals(); /** * Get information about an address in the code of the current program. * @param address Address to look up. * @param info Filled with information about the given address. Source file * and line number are filled only if the binary file was compiled * with debug information, and UCS was configured with detailed * backtrace enabled. * @return UCS_ERR_NO_ELEM if the address is not found, UCS_OK otherwise. */ ucs_status_t ucs_debug_lookup_address(void *address, ucs_debug_address_info_t *info); /** * @return Full path to current library. */ const char *ucs_debug_get_lib_path(); /** * @return UCS library loading address. */ unsigned long ucs_debug_get_lib_base_addr(); /** * Create a backtrace from the calling location. * * @param bckt Backtrace object. * @param strip How many frames to strip. */ ucs_status_t ucs_debug_backtrace_create(backtrace_h *bckt, int strip); /** * Destroy a backtrace and free all memory. * * @param bckt Backtrace object. */ void ucs_debug_backtrace_destroy(backtrace_h bckt); /** * Walk to the next backtrace line information. * * @param bckt Backtrace object. * @param line Filled with backtrace frame info. * * NOTE: the line remains valid as long as the backtrace object is not destroyed. */ int ucs_debug_backtrace_next(backtrace_h bckt, backtrace_line_h *line); /** * Print backtrace line to string buffer. * * @param buffer Target buffer to print to. * @param maxlen Size of target buffer. * @param frame_num Frame number * @param line Backtrace line to print */ void ucs_debug_print_backtrace_line(char *buffer, size_t maxlen, int frame_num, backtrace_line_h line); /** * Print backtrace to an output stream. * * @param stream Stream to print to. * @param strip How many frames to strip. */ void ucs_debug_print_backtrace(FILE *stream, int strip); /** * Called when UCS detects a fatal error and provides means to debug the current * state of UCS. */ void ucs_handle_error(const char *message); /** * @return Name of a symbol which begins in the given address, or NULL if * not found. */ const char *ucs_debug_get_symbol_name(void *address); #endif