blob: 3bc6370991cd9d8ad82d7d981b979c9507fa939a [file] [log] [blame]
/* **********************************************************
* Copyright (c) 2011-2014 Google, Inc. All rights reserved.
* Copyright (c) 2009-2010 VMware, Inc. All rights reserved.
* **********************************************************/
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of VMware, Inc. nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
/* DRSyms DynamoRIO Extension
*
* Symbol lookup support (Issue 44).
* Currently supports Windows PDB, ELF symtab, Windows PECOFF,
* Mach-O symtab, and DWARF on Windows, Linux, and MacOS.
* No stabs support yet.
*
* This API will eventually support both sideline (via a separate
* process) and online use. Today only online use is supported.
* Although there are new proposals that do not need sideline and rely
* on using pre-populated symbol caches for symbols needed to run correctly
* combined with post-processing for symbols only needed for presentation
* that are gaining favor, making sideline no longer a certainty.
*/
#ifndef _DRSYMS_H_
#define _DRSYMS_H_ 1
/**
* @file drsyms.h
* @brief Header for DRSyms DynamoRIO Extension
*/
#ifdef __cplusplus
extern "C" {
#endif
/* Our API routines take the full path to the module in every query,
* both for simplicity of use and to allow for flexibility in
* implementation: can unload symbol data if running out of space
* without tracking what was previously loaded.
*
* They also take in an offset from the module base, rather than an absolute
* address, to be agnostic of relocation.
*/
/**
* \addtogroup drsyms Symbol Access Library
*/
/**@{*/ /* begin doxygen group */
/** Success code for each DRSyms operation */
typedef enum {
DRSYM_SUCCESS, /**< Operation succeeded. */
DRSYM_ERROR, /**< Operation failed. */
DRSYM_ERROR_INVALID_PARAMETER, /**< Operation failed: invalid parameter */
DRSYM_ERROR_INVALID_SIZE, /**< Operation failed: invalid size */
DRSYM_ERROR_LOAD_FAILED, /**< Operation failed: unable to load symbols */
DRSYM_ERROR_SYMBOL_NOT_FOUND, /**< Operation failed: symbol not found */
DRSYM_ERROR_LINE_NOT_AVAILABLE, /**< Operation failed: line info not available */
DRSYM_ERROR_NOT_IMPLEMENTED, /**< Operation failed: not yet implemented */
DRSYM_ERROR_FEATURE_NOT_AVAILABLE, /**< Operation failed: not available */
DRSYM_ERROR_NOMEM, /**< Operation failed: not enough memory */
DRSYM_ERROR_RECURSIVE, /**< Operation failed: unavailable when recursive */
} drsym_error_t;
/** Bitfield of options to each DRSyms operation. */
typedef enum {
/**
* Do not demangle C++ symbols. This option is not available for
* Windows PDB symbols.
*/
DRSYM_LEAVE_MANGLED = 0x00,
/**
* Demangle C++ symbols, omitting templates and parameter types.
* For all symbol types, templates are collapsed to <> while function
* parameters are omitted entirely (without any parentheses).
*/
DRSYM_DEMANGLE = 0x01,
/**
* Demangle template arguments and parameter types. This option is not
* available for Windows PDB symbols (except in drsym_demangle_symbol()).
*/
DRSYM_DEMANGLE_FULL = 0x02,
/** For Windows PDB, do not collapse templates to <>. */
DRSYM_DEMANGLE_PDB_TEMPLATES = 0x04,
/**
* Windows-only, for drsym_search_symbols_ex().
* Requests a full search for all symbols and not just functions.
* This adds overhead: see drsym_search_symbols_ex() for details.
*/
DRSYM_FULL_SEARCH = 0x08,
DRSYM_DEFAULT_FLAGS = DRSYM_DEMANGLE, /**< Default flags. */
} drsym_flags_t;
/**
* Bitfield indicating the availability of different kinds of debugging
* information for a module. The first 8 bits are reserved for platform
* independent qualities of the debug info, while the rest indicate exactly
* which kind of debug information is present.
*/
typedef enum {
DRSYM_SYMBOLS = (1 << 0), /**< Any symbol information beyond exports. */
DRSYM_LINE_NUMS = (1 << 1), /**< Any line number info. */
/* Platform-dependent types. */
DRSYM_ELF_SYMTAB = (1 << 8), /**< ELF .symtab symbol names. */
DRSYM_DWARF_LINE = (1 << 9), /**< DWARF line info. */
DRSYM_PDB = (1 << 10), /**< Windows PDB files. */
DRSYM_PECOFF_SYMTAB = (1 << 11), /**< PE COFF (Cygwin or MinGW) symbol table names.*/
DRSYM_MACHO_SYMTAB = (1 << 12), /**< Mach-O symbol table names. */
} drsym_debug_kind_t;
/** Data structure that holds symbol information */
typedef struct _drsym_info_t {
/* INPUTS */
/** Input: should be set by caller to sizeof(drsym_info_t) */
size_t struct_size;
/** Input: should be set by caller to the size of the name buffer, in bytes */
size_t name_size;
/** Input: should be set by caller to the size of the file buffer, in bytes */
size_t file_size;
/* OUTPUTS */
/**
* Output: size of data available for file (not including terminating null).
* Only file_size bytes will be copied to file.
*/
size_t file_available_size;
/**
* Output: file name (storage allocated by caller, of size file_size).
* Guaranteed to be null-terminated.
* Optional: can be set to NULL.
*/
char *file;
/** Output: line number */
uint64 line;
/** Output: offset from address that starts at line */
size_t line_offs;
/**
* Output: offset from module base of start of symbol.
* For Mach-O executables, the module base is after any __PAGEZERO segment.
*/
size_t start_offs;
/**
* Output: offset from module base of end of symbol.
* \note For DRSYM_PECOFF_SYMTAB (Cygwin or MinGW) or DRSYM_MACHO_SYMTAB (MacOS)
* symbols, the end offset is not known precisely.
* The start address of the subsequent symbol will be stored here.
**/
size_t end_offs;
/** Output: type of the debug info available for this module */
drsym_debug_kind_t debug_kind;
/** Output: type id for passing to drsym_expand_type() */
uint type_id;
/**
* Output: size of data available for name (not including terminating null).
* Only name_size bytes will be copied to name.
*/
size_t name_available_size;
/**
* Output: symbol name (storage allocated by caller, of size name_size).
* Guaranteed to be null-terminated.
* Optional: can be set to NULL.
*/
char *name;
/** Output: the demangling status of the symbol, as drsym_flags_t values. */
uint flags;
} drsym_info_t;
#ifdef WINDOWS
# define IF_WINDOWS_ELSE(x, y) x
#else
# define IF_WINDOWS_ELSE(x, y) y
#endif
DR_EXPORT
/**
* Initialize the symbol access library.
* Can be called multiple times (by separate components, normally) but
* each call must be paired with a corresponding call to
* drsym_exit(), and only the symbol server parameter of the first
* call will be honored.
*
* @param[in] shmid Identifies the symbol server for sideline operation.
* \note Sideline operation is not yet implemented.
*/
drsym_error_t drsym_init(IF_WINDOWS_ELSE(const wchar_t *, int) shmid);
DR_EXPORT
/**
* Clean up and shut down the symbol access library.
*/
drsym_error_t
drsym_exit(void);
DR_EXPORT
/**
* Retrieves symbol information for a given module offset.
* When returning DRSYM_ERROR_LINE_NOT_AVAILABLE, the symbol information
* start_offs, end_offs, and name will still be valid.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] modoffs The offset from the base of the module specifying the address
* to be queried.
* For Mach-O executables, the module base is after any __PAGEZERO segment.
* @param[in,out] info Information about the symbol at the queried address.
* @param[in] flags Options for the operation as a combination of drsym_flags_t
* values. Ignored for Windows PDB (DRSYM_PDB) except for
* DRSYM_DEMANGLE_PDB_TEMPLATES.
*/
drsym_error_t
drsym_lookup_address(const char *modpath, size_t modoffs, drsym_info_t *info /*INOUT*/,
uint flags);
enum {
DRSYM_TYPE_OTHER, /**< Unknown type, cannot downcast. */
DRSYM_TYPE_INT, /**< Integer, cast to drsym_int_type_t. */
DRSYM_TYPE_PTR, /**< Pointer, cast to drsym_ptr_type_t. */
DRSYM_TYPE_FUNC, /**< Function, cast to drsym_func_type_t. */
DRSYM_TYPE_VOID, /**< Void. No further information. */
DRSYM_TYPE_COMPOUND, /**< Struct, union, or class; cast to drsym_compound_type_t. */
DRSYM_TYPE_ARRAY, /** <Array cast to drsym_array_type_t. */
/* Additional type kinds will be added as needed. */
};
/**
* Base type information.
* Use the 'kind' member to downcast to a more specific type.
*/
typedef struct _drsym_type_t {
uint kind; /**< Type kind, i.e. DRSYM_TYPE_INT or DRSYM_TYPE_PTR. */
size_t size; /**< Type size. */
uint id; /**< Unique identifier to pass to drsym_expand_type(). */
} drsym_type_t;
/** Type information for a function. */
typedef struct _drsym_func_type_t {
drsym_type_t type;
drsym_type_t *ret_type;
int num_args; /**< Number of arguments. */
/** Separate array of size num_args. May be NULL if the data was not requested. */
drsym_type_t **arg_types;
} drsym_func_type_t;
/** Type information for a user-defined type: a struct, union, or class. */
typedef struct _drsym_compound_type_t {
drsym_type_t type;
char *name; /**< Name of the type. */
int num_fields; /**< Number of fields. */
/** Separate array of size num_fields. May be NULL if the data was not requested. */
drsym_type_t **field_types;
} drsym_compound_type_t;
/** Type information for an integer base type. */
typedef struct _drsym_int_type_t {
drsym_type_t type;
bool is_signed;
} drsym_int_type_t;
/** Type information for a pointer & array types. */
typedef struct _drsym_ptr_type_t {
drsym_type_t type;
drsym_type_t *elt_type;
} drsym_ptr_type_t;
DR_EXPORT
/**
* Retrieves symbol type information for a given module offset. After a
* successful execution, \p *type points to the function type. All memory
* used to represent the types comes from \p buf, so the caller only needs to
* dispose \p buf to free them. Returns DRSYM_ERROR_NOMEM if the buffer is not
* big enough.
*
* This routine expands arguments of function or fields compound types into
* their child types as far as \p levels_to_expand levels deep.
* The resulting expanded type tree may be recursive, so the caller should take
* care when traversing it. Any already-referenced type is guaranteed to have
* a smaller pointer value than its parent. This allows safe traversing without
* recording the already-seen types.
*
* When querying type information for a symbol that has already been located
* via drsym_lookup_address() or via enumeration or searching, it is better
* to invoke drsym_expand_type() using the \p type_id parameter of #drsym_info_t
* to properly handle cases where multiple symbols map to the same module offset.
*
* \note This function is currently implemented only for Windows PDB
* symbols (DRSYM_PDB).
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] modoffs The offset from the base of the module specifying
* the start address of the function.
* For Mach-O, the module base is after any __PAGEZERO segment.
* @param[in] levels_to_expand The maximum levels of sub-types to expand.
* Set to UINT_MAX for unlimited expansion.
* Further expansion can be performed by calling
* drsym_expand_type().
* @param[out] buf Memory used for the types.
* @param[in] buf_sz Number of bytes in \p buf.
* @param[out] type Pointer to the type of the function.
*/
drsym_error_t
drsym_get_type(const char *modpath, size_t modoffs, uint levels_to_expand, char *buf,
size_t buf_sz, drsym_type_t **type /*OUT*/);
DR_EXPORT
/**
* Retrieves symbol type information for a given \p type_name. After a
* successful execution, \p *type points to the type of the symbol. All memory
* used to represent the type comes from \p buf, so the caller only needs to
* dispose \p buf to free everything. Returns DRSYM_ERROR_NOMEM if the buffer is not
* big enough.
*
* \note This function is currently implemented only for Windows PDB
* symbols (DRSYM_PDB).
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] type_name The string name of the base type.
* @param[out] buf Memory used for the type.
* @param[in] buf_sz Number of bytes in \p buf.
* @param[out] type Pointer to the type for the symbol.
*/
drsym_error_t
drsym_get_type_by_name(const char *modpath, const char *type_name, char *buf,
size_t buf_sz, drsym_type_t **type /*OUT*/);
DR_EXPORT
/**
* Retrieves function type information for a given module offset. After a
* successful execution, \p *func_type points to the function type. All memory
* used to represent the types comes from \p buf, so the caller only needs to
* dispose \p buf to free them. Returns DRSYM_ERROR_NOMEM if the buffer is not
* big enough.
*
* This routine does not expand arguments of function or compound types into
* their child types.
*
* \note This function is currently implemented only for Windows PDB
* symbols (DRSYM_PDB).
*
* \note The public Windows symbol files typically do not contain type
* information for function parameters.
*
* \note Despite the name, this routine will retrieve type information
* for non-functions as well.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] modoffs The offset from the base of the module specifying
* the start address of the function.
* For Mach-O, the module base is after any __PAGEZERO segment.
* @param[out] buf Memory used for the types.
* @param[in] buf_sz Number of bytes in \p buf.
* @param[out] func_type Pointer to the type of the function.
*/
drsym_error_t
drsym_get_func_type(const char *modpath, size_t modoffs, char *buf, size_t buf_sz,
drsym_func_type_t **func_type /*OUT*/);
DR_EXPORT
/**
* Retrieves symbol type information for all sub-types of the type
* referenced by \p type_id. After a
* successful execution, \p *expanded_type points to the expanded type. All memory
* used to represent the types comes from \p buf, so the caller only needs to
* dispose \p buf to free them. Returns DRSYM_ERROR_NOMEM if the buffer is not
* big enough.
*
* The initial type index to pass as \p type_id can be retrieved by
* calling drsym_get_type() or drsym_get_func_type().
*
* The resulting expanded type tree may be recursive, so the caller should take
* care when traversing it. Any already-referenced type is guaranteed to have
* a smaller pointer value than its parent. This allows safe traversing without
* recording the already-seen types.
*
* \note This function is currently implemented only for Windows PDB
* symbols (DRSYM_PDB).
*
* \note The public Windows symbol files typically do not contain type
* information for function parameters.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] type_id The type index, acquired from a prior call to
* drsym_get_type() or drsym_get_func_type().
* @param[in] levels_to_expand The maximum levels of sub-types to expand.
* Set to UINT_MAX for unlimited expansion.
* @param[out] buf Memory used for the types.
* @param[in] buf_sz Number of bytes in \p buf.
* @param[out] expanded_type Pointer to the expanded type tree for the symbol.
*/
drsym_error_t
drsym_expand_type(const char *modpath, uint type_id, uint levels_to_expand, char *buf,
size_t buf_sz, drsym_type_t **expanded_type /*OUT*/);
DR_EXPORT
/**
* Retrieves the address for a given symbol name.
*
* For Windows PDB symbols (DRSYM_PDB), we don't support the
* DRSYM_DEMANGLE_FULL flag. Also for Windows PDB, if DRSYM_DEMANGLE is
* set, \p symbol must include the template arguments. Consider
* using drsym_search_symbols_ex() instead with "<*>" for each template
* instantation in order to locate all symbols regardless of template
* arguments.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] symbol The name of the symbol being queried.
* To specify a target module, pass "modulename!symbolname" as the symbol
* string to look up.
* @param[out] modoffs The offset from the base of the module specifying the address
* of the specified symbol.
* For Mach-O, the module base is after any __PAGEZERO segment.
* @param[in] flags Options for the operation as a combination of drsym_flags_t
* values. Ignored for Windows PDB (DRSYM_PDB).
*/
drsym_error_t
drsym_lookup_symbol(const char *modpath, const char *symbol, size_t *modoffs /*OUT*/,
uint flags);
/**
* Type for drsym_enumerate_symbols and drsym_search_symbols callback function.
* Returns whether to continue the enumeration or search.
*
* @param[in] name Name of the symbol.
* @param[in] modoffs Offset of the symbol from the module base.
* For Mach-O, the module base is after any __PAGEZERO segment.
* @param[in] data User parameter passed to drsym_enumerate_symbols() or
* drsym_search_symbols().
*/
typedef bool (*drsym_enumerate_cb)(const char *name, size_t modoffs, void *data);
/**
* Type for drsym_enumerate_symbols_ex and drsym_search_symbols_ex callback function.
* Returns whether to continue the enumeration or search.
*
* @param[in] info Information about the symbol.
* @param[in] status Status of \p info: either DRSYM_SUCCESS to indicate that all
* fields are filled in, or DRSYM_ERROR_LINE_NOT_AVAILABLE to
* indicate that line number information was not obtained. Line
* information is currently not available for any debug type when
* iterating. This has no bearing on whether line information is
* available when calling drsym_lookup_address().
* @param[in] data User parameter passed to drsym_enumerate_symbols() or
* drsym_search_symbols().
*/
typedef bool (*drsym_enumerate_ex_cb)(drsym_info_t *info, drsym_error_t status,
void *data);
DR_EXPORT
/**
* Enumerates all symbol information for a given module, including exports.
* Calls the given callback function for each symbol.
* If the callback returns false, the enumeration will end.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] callback Function to call for each symbol found.
* @param[in] data User parameter passed to callback.
* @param[in] flags Options for the operation as a combination of drsym_flags_t
* values. Ignored for Windows PDB (DRSYM_PDB) except for
* DRSYM_DEMANGLE_PDB_TEMPLATES.
*/
drsym_error_t
drsym_enumerate_symbols(const char *modpath, drsym_enumerate_cb callback, void *data,
uint flags);
DR_EXPORT
/**
* Enumerates all symbol information for a given module, including exports.
* Calls the given callback function for each symbol, passing full information
* about the symbol (as opposed to selected information returned by
* drsym_enumerate_symbols()).
* If the callback returns false, the enumeration will end.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] callback Function to call for each symbol found.
* @param[in] info_size The size of the drsym_info_t struct to pass to \p callback.
* Enough space for each name will be allocated automatically.
* @param[in] data User parameter passed to callback.
* @param[in] flags Options for the operation as a combination of drsym_flags_t
* values. Ignored for Windows PDB (DRSYM_PDB) except for
* DRSYM_DEMANGLE_PDB_TEMPLATES.
*/
drsym_error_t
drsym_enumerate_symbols_ex(const char *modpath, drsym_enumerate_ex_cb callback,
size_t info_size, void *data, uint flags);
DR_EXPORT
/**
* Given a mangled or decorated C++ symbol, outputs the source name into \p dst.
* If the unmangled name requires more than \p dst_sz bytes, it is truncated and
* null-terminated to fit into \p dst. If the unmangling fails, \p symbol is
* copied as-is into \p dst, and truncated and null-terminated to fit.
* Returns zero if the name could not be unmangled; else returns the number of
* characters in the unmangled name, including the terminating null.
*
* If the unmangling is successful but \p dst is too small to hold it, returns
* the number of characters required to store the name, including the
* terminating null, just as in a successful case. On Linux or for Windows PDB,
* \p symbol is copied as-is into \p dst just like for unmangling failure; for
* Windows PECOFF, the unmangled name is copied, truncated to fit, and
* null-terminated.
*
* If there was overflow, the return value may be an estimate of the required
* size, so a second attempt with the return value is not guaranteed to be
* successful. If the caller needs the full name, they may need to make
* multiple attempts with a larger buffer.
*
* \note If the passed-in mangled symbol is truncated already, there
* is no guarantee that the demangling will even partically succeed.
*
* @param[out] dst Output buffer for demangled name.
* @param[in] dst_sz Size of the output buffer in bytes.
* @param[in] mangled Mangled C++ symbol to demangle.
* @param[in] flags Options for the operation as a combination of drsym_flags_t
* values. DRSYM_DEMANGLE is implied.
*/
size_t
drsym_demangle_symbol(char *dst, size_t dst_sz, const char *mangled, uint flags);
DR_EXPORT
/**
* Outputs the kind of debug information available for the module \p modpath in
* \p *kind if the operation succeeds.
*
* @param[in] modpath The full path to the module to be queried.
* @param[out] kind The kind of debug information available.
*/
drsym_error_t
drsym_get_module_debug_kind(const char *modpath, drsym_debug_kind_t *kind /*OUT*/);
DR_EXPORT
/**
* Returns whether debug information is available for the module \p modpath.
* This can be faster than calling drsym_get_module_debug_kind(), but it
* should be equivalent to calling drsym_get_module_debug_kind() and
* looking for DRSYM_SYMBOLS in the output.
*
* @param[in] modpath The full path to the module to be queried.
*/
drsym_error_t
drsym_module_has_symbols(const char *modpath);
#ifdef WINDOWS
DR_EXPORT
/**
* Enumerates all symbol information (including exports) matching a
* pattern for a given module.
* Calls the given callback function for each matching symbol.
* If the callback returns false, the enumeration will end.
*
* This routine is only supported for PDB symbols (DRSYM_PDB).
*
* Modifying the demangling is currently not supported:
* DRSYM_DEFAULT_FLAGS is used.
*
* Due to dbghelp leaving template parameters in place (they are removed
* for DRSYM_DEMANGLE in the drsyms library itself), searching may find
* symbols that do not appear to match due to drsyms having removed that
* part of the symbol name.
*
* \note drsym_search_symbols() with full=false is significantly
* faster and uses less memory than drsym_enumerate_symbols(), and is
* faster than drsym_lookup_symbol(), but requires dbghelp.dll version
* 6.3 or higher. If an earlier version is used, this function will
* use a slower mechanism to perform the search.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] match Regular expression describing the names of the symbols
* to be enumerated. To specify a target module, use the
* "module_pattern!symbol_pattern" format.
* @param[in] full Whether to search all symbols or (the default) just
* functions. A full search takes significantly
* more time and memory and eliminates the
* performance advantage over other lookup
* methods. A full search requires dbghelp.dll
* version 6.6 or higher.
* @param[in] callback Function to call for each matching symbol found.
* @param[in] data User parameter passed to callback.
*/
drsym_error_t
drsym_search_symbols(const char *modpath, const char *match, bool full,
drsym_enumerate_cb callback, void *data);
DR_EXPORT
/**
* Enumerates all symbol information (including exports) matching a
* pattern for a given module.
* Calls the given callback function for each symbol, passing full information
* about the symbol (as opposed to selected information returned by
* drsym_search_symbols()).
* If the callback returns false, the enumeration will end.
*
* This routine is only supported for PDB symbols (DRSYM_PDB).
*
* Modifying the demangling is currently not supported:
* DRSYM_DEFAULT_FLAGS is used.
*
* Due to dbghelp leaving template parameters in place (they are removed
* for DRSYM_DEMANGLE in the drsyms library itself), searching may find
* symbols that do not appear to match due to drsyms having removed that
* part of the symbol name.
*
* \note The performance note for drsym_search_symbols() applies here
* as well.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] match Regular expression describing the names of the symbols
* to be enumerated. To specify a target module, use the
* "module_pattern!symbol_pattern" format.
* @param[in] flags Options for the operation as a combination of drsym_flags_t
* values. DRSYM_LEAVE_MANGLED and DRSYM_DEMANGLE_FULL are
* ignored. DRSYM_FULL_SEARCH, if set, requests to search all
* symbols as opposed to the default of just functions. A full
* search takes significantly more time and memory and
* eliminates the performance advantage over other lookup
* methods. A full search requires dbghelp.dll version 6.6 or
* higher.
* @param[in] callback Function to call for each matching symbol found.
* @param[in] info_size The size of the drsym_info_t struct to pass to \p callback.
* Enough space for each name will be allocated automatically.
* @param[in] data User parameter passed to callback.
*/
drsym_error_t
drsym_search_symbols_ex(const char *modpath, const char *match, uint flags,
drsym_enumerate_ex_cb callback, size_t info_size, void *data);
#endif
DR_EXPORT
/**
* Indicates that no further symbol queries will be performed and that
* this module's debug information can be de-allocated.
* A later query will result in a new load.
* The typical usage is to call this after a series of queries at module
* load. For large applications with many libraries, calling this
* can save hundreds of MB of memory.
*
* @param[in] modpath The full path to the module to be unloaded.
*
* \note When called from within a callback for drsym_enumerate_symbols()
* or drsym_search_symbols(), will fail with DRSYM_ERROR_RECURSIVE as it
* is not safe to free resources while iterating.
*/
drsym_error_t
drsym_free_resources(const char *modpath);
/***************************************************************************
* Line iteration
*/
/**
* Line information returned by drsym_enumerate_lines().
* This information should not be relied upon to be accessible
* beyond the return of the callback routine to which it is passed.
*
* \note On Windows, we have observed abnormally large values for
* \p line and \p line_addr (e.g., 0xfeefee or 0xe0b80000) in some
* symbol files. Be prepared for such values.
*/
typedef struct _drsym_line_info_t {
/** Compilation unit (object file) name */
const char *cu_name;
/** Source file name */
const char *file;
/** Line number */
uint64 line;
/**
* Offset from module base of the first instruction of the line.
* For Mach-O executables, the module base is after any __PAGEZERO segment.
*/
size_t line_addr;
} drsym_line_info_t;
/**
* Type for drsym_enumerate_lines callback function.
* Returns whether to continue the enumeration.
*
* @param[in] info Information about the line.
* @param[in] data User parameter passed to drsym_enumerate_lines().
*/
typedef bool (*drsym_enumerate_lines_cb)(drsym_line_info_t *info, void *data);
DR_EXPORT
/**
* Enumerates all source lines for a given module.
* Calls the given callback function for each line.
* If the callback returns false, the enumeration will end.
*
* If an individual compilation unit is missing line number information,
* the callback will still be called once for that unit, with the fields other
* than \p cu_name set to NULL or 0.
*
* @param[in] modpath The full path to the module to be queried.
* @param[in] callback Function to call for each line.
* @param[in] data User parameter passed to callback.
*/
drsym_error_t
drsym_enumerate_lines(const char *modpath, drsym_enumerate_lines_cb callback, void *data);
/**@}*/ /* end doxygen group */
#ifdef __cplusplus
}
#endif
#endif /* _DRSYMS_H_ */