/**
* Copyright (C) Mellanox Technologies Ltd. 2001-2014. ALL RIGHTS RESERVED.
*
* See file LICENSE for terms.
*/
#ifndef UCS_DEBUG_H_
#define UCS_DEBUG_H_
#include <ucs/datastruct/list.h>
#include <ucs/type/status.h>
#include <ucs/config/types.h>
#include <stdio.h>
/**
* 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