15 #define MAX_SYM_SIZE 255 37 static int first_call = 1;
38 static HANDLE process =
NULL;
39 DWORD64 displacement64 = 0;
40 DWORD displacement = 0;
48 SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS);
49 process = GetCurrentProcess();
54 symbol = (SYMBOL_INFO *)calloc(
sizeof(SYMBOL_INFO) + (
MAX_SYM_SIZE + 1) *
sizeof(
char), 1);
56 symbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
57 if (!SymFromAddr(process, (DWORD64)addr, &displacement64, symbol))
65 if ( (symbol_entry =
gphFind(symbol_table, symbol->Name, addr)) !=
NULL )
71 symbol_entry =
gphAdd(symbol_table, symbol->Name, addr);
74 symbol_data->
value = (
void*)symbol->Address;
75 line.SizeOfStruct =
sizeof(IMAGEHLP_LINE64);
76 if (SymGetLineFromAddr64(process, (DWORD64)addr, &displacement, &line))
79 symbol_data->
line = line.LineNumber;
80 len = strlen(line.FileName) + 32;
81 symbol_data->
fileAndLine = calloc((len + 1) *
sizeof(
char), 1);
84 symbol_entry->
userPvt = symbol_data;
97 # if defined(_WIN64) && defined(EPICS_CALL_DLL)
#define EPICS_STACKTRACE_LCL_SYMBOLS
int epicsFindAddrGetFeatures(void)
#define EPICS_STACKTRACE_GBL_SYMBOLS
char * strdup(const char *)
LIBCOM_API void epicsStdCall gphInitPvt(struct gphPvt **ppvt, int tableSize)
LIBCOM_API GPHENTRY *epicsStdCall gphFind(struct gphPvt *pvt, const char *name, void *pvtid)
#define EPICS_STACKTRACE_DYN_SYMBOLS
int epicsFindAddr(void *addr, epicsSymbol *sym_p)
LIBCOM_API int epicsStdCall epicsSnprintf(char *str, size_t size, const char *format,...) EPICS_PRINTF_STYLE(3
LIBCOM_API GPHENTRY *epicsStdCall gphAdd(struct gphPvt *pvt, const char *name, void *pvtid)