This is Unofficial EPICS BASE Doxygen Site
osdFindAddr.c File Reference
#include <windows.h>
#include <dbghelp.h>
#include "epicsStackTracePvt.h"
#include "epicsStackTrace.h"
#include "epicsString.h"
#include "epicsStdio.h"
#include "gpHash.h"
+ Include dependency graph for osdFindAddr.c:

Go to the source code of this file.

Classes

struct  SymbolData
 

Macros

#define MAX_SYM_SIZE   255
 

Functions

int epicsFindAddr (void *addr, epicsSymbol *sym_p)
 
int epicsFindAddrGetFeatures (void)
 

Macro Definition Documentation

#define MAX_SYM_SIZE   255

Definition at line 15 of file osdFindAddr.c.

Function Documentation

int epicsFindAddr ( void *  addr,
epicsSymbol sym_p 
)

Definition at line 35 of file osdFindAddr.c.

36 {
37  static int first_call = 1;
38  static HANDLE process = NULL;
39  DWORD64 displacement64 = 0;
40  DWORD displacement = 0;
41  SYMBOL_INFO *symbol;
42  IMAGEHLP_LINE64 line;
43  GPHENTRY* symbol_entry;
44  SymbolData* symbol_data;
45  size_t len;
46  if (first_call)
47  {
48  SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_DEFERRED_LOADS);
49  process = GetCurrentProcess();
50  SymInitialize(process, NULL, TRUE);
51  gphInitPvt(&symbol_table, 256); /* table size must be a power of 2 in range 256 to 65536 */
52  first_call = 0;
53  }
54  symbol = (SYMBOL_INFO *)calloc(sizeof(SYMBOL_INFO) + (MAX_SYM_SIZE + 1) * sizeof(char), 1);
55  symbol->MaxNameLen = MAX_SYM_SIZE;
56  symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
57  if (!SymFromAddr(process, (DWORD64)addr, &displacement64, symbol))
58  {
59  sym_p->s_nam = 0;
60  sym_p->s_val = 0;
61  sym_p->f_nam = 0;
62  free(symbol);
63  return -1;
64  }
65  if ( (symbol_entry = gphFind(symbol_table, symbol->Name, addr)) != NULL )
66  {
67  symbol_data = (SymbolData*)symbol_entry->userPvt;
68  }
69  else
70  {
71  symbol_entry = gphAdd(symbol_table, symbol->Name, addr);
72  symbol_data = (SymbolData*)calloc(sizeof(SymbolData), 1);
73  symbol_data->name = strdup(symbol->Name);
74  symbol_data->value = (void*)symbol->Address;
75  line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
76  if (SymGetLineFromAddr64(process, (DWORD64)addr, &displacement, &line))
77  {
78  symbol_data->file = strdup(line.FileName);
79  symbol_data->line = line.LineNumber;
80  len = strlen(line.FileName) + 32; /* add enough for [line %lu] */
81  symbol_data->fileAndLine = calloc((len + 1) * sizeof(char), 1);
82  epicsSnprintf(symbol_data->fileAndLine, len, "%s[line %lu]", line.FileName, (unsigned long)line.LineNumber);
83  }
84  symbol_entry->userPvt = symbol_data;
85  }
86  sym_p->s_nam = symbol_data->name;
87  sym_p->s_val = symbol_data->value;
88  sym_p->f_nam = symbol_data->fileAndLine;
89  free(symbol);
90  return 0;
91 }
#define MAX_SYM_SIZE
Definition: osdFindAddr.c:15
bucket ** symbol_table
Definition: symtab.c:18
char * strdup(const char *)
char * name
Definition: osdFindAddr.c:28
#define NULL
Definition: catime.c:38
LIBCOM_API void epicsStdCall gphInitPvt(struct gphPvt **ppvt, int tableSize)
Definition: gpHashLib.c:37
void * userPvt
Definition: gpHash.h:25
LIBCOM_API GPHENTRY *epicsStdCall gphFind(struct gphPvt *pvt, const char *name, void *pvtid)
Definition: gpHashLib.c:92
const char * f_nam
char * line
Definition: reader.c:25
size_t line
Definition: osdFindAddr.c:32
const char * s_nam
void * value
Definition: osdFindAddr.c:29
#define TRUE
Definition: dbDefs.h:27
char * fileAndLine
Definition: osdFindAddr.c:31
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)
Definition: gpHashLib.c:97
char * file
Definition: osdFindAddr.c:30
int epicsFindAddrGetFeatures ( void  )

Definition at line 93 of file osdFindAddr.c.

94 {
95 #if defined(_MINGW)
96 /* 64bit MINGW can lookup DLL public symbols, 32bit cannot - but we need to be a dynamic build to have a DLL to lookup */
97 # if defined(_WIN64) && defined(EPICS_CALL_DLL)
99 # else
100  return 0; /* only able to print addresses */
101 # endif /* _WIN64 && EPICS_CALL_DLL */
102 #else
106 #endif /* _MINGW */
107 }
#define EPICS_STACKTRACE_LCL_SYMBOLS
#define EPICS_STACKTRACE_GBL_SYMBOLS
#define EPICS_STACKTRACE_DYN_SYMBOLS