42#if defined (HAVE_KERN_PROC_ARGS) || defined (HAVE_KERN_PROC)
43#include <sys/sysctl.h>
46#ifdef HAVE_MACH_O_DYLD_H
47#include <mach-o/dyld.h>
55#ifndef WIN32_LEAN_AND_MEAN
56#define WIN32_LEAN_AND_MEAN
69#ifndef HAVE_GETEXECNAME
70#define getexecname() NULL
78 struct shl_descriptor *desc;
79 size_t len =
sizeof (
struct shl_descriptor);
85 if (shl_get_r (0, desc) == -1)
91 return desc->filename;
96#define hpux_get_executable_path(state, error_callback, data) NULL
100#if !defined (HAVE_KERN_PROC_ARGS) && !defined (HAVE_KERN_PROC)
102#define sysctl_exec_name1(state, error_callback, data) NULL
103#define sysctl_exec_name2(state, error_callback, data) NULL
109 int mib0,
int mib1,
int mib2,
int mib3,
122 if (sysctl (
mib, 4, NULL, &len, NULL, 0) < 0)
128 if (sysctl (
mib, 4,
name, &rlen, NULL, 0) < 0)
136#ifdef HAVE_KERN_PROC_ARGS
143 return sysctl_exec_name (
state, CTL_KERN, KERN_PROC_ARGS, -1,
149#define sysctl_exec_name1(state, error_callback, data) NULL
160 return sysctl_exec_name (
state, CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1,
166#define sysctl_exec_name2(state, error_callback, data) NULL
172#ifdef HAVE_MACH_O_DYLD_H
182 if (_NSGetExecutablePath (NULL, &len) == 0)
187 if (_NSGetExecutablePath (
name, &len) != 0)
197#define macho_get_executable_path(state, error_callback, data) NULL
203#define windows_executable_filename() _pgmptr
207#define windows_executable_filename() NULL
213#define FILENAME_BUF_SIZE (MAX_PATH)
223 error = GetLastError ();
228 "could not get the filename of the current executable",
237#define windows_get_executable_path(buf, error_callback, data) NULL
238#define FILENAME_BUF_SIZE 64
252 int called_error_callback;
254 const char *filename;
257 if (!
state->threaded)
258 failed =
state->fileline_initialization_failed;
268 if (!
state->threaded)
269 fileline_fn =
state->fileline_fn;
272 if (fileline_fn != NULL)
278 called_error_callback = 0;
279 for (pass = 0; pass < 11; ++pass)
286 filename =
state->filename;
297 filename =
"/proc/self/exe";
300 filename =
"/proc/curproc/file";
303 snprintf (buf,
sizeof (buf),
"/proc/%ld/object/a.out",
326 if (filename == NULL)
331 if (descriptor < 0 && !does_not_exist)
333 called_error_callback = 1;
342 if (!called_error_callback)
344 if (
state->filename != NULL)
348 "libbacktrace could not find executable to open",
363 if (!
state->threaded)
364 state->fileline_initialization_failed = 1;
370 if (!
state->threaded)
371 state->fileline_fn = fileline_fn;
393 if (
state->fileline_initialization_failed)
409 if (
state->fileline_initialization_failed)
428 bdata->ret =
bdata->full_callback (
bdata->full_data, pc, NULL, 0, symname);
void * backtrace_alloc(struct backtrace_state *state ATTRIBUTE_UNUSED, size_t size, backtrace_error_callback error_callback, void *data)
void backtrace_free(struct backtrace_state *state ATTRIBUTE_UNUSED, void *p, size_t size ATTRIBUTE_UNUSED, backtrace_error_callback error_callback ATTRIBUTE_UNUSED, void *data ATTRIBUTE_UNUSED)
void(* backtrace_syminfo_callback)(void *data, uintptr_t pc, const char *symname, uintptr_t symval, uintptr_t symsize)
void(* backtrace_error_callback)(void *data, const char *msg, int errnum)
int(* backtrace_full_callback)(void *data, uintptr_t pc, const char *filename, int lineno, const char *function)
static void error_callback(void *data, const char *msg, int errnum)
int backtrace_initialize(struct backtrace_state *state, const char *filename, int descriptor, backtrace_error_callback error_callback, void *data, fileline *fileline_fn)
static int fileline_initialize(struct backtrace_state *state, backtrace_error_callback error_callback, void *data)
void backtrace_syminfo_to_full_callback(void *data, uintptr_t pc, const char *symname, uintptr_t symval ATTRIBUTE_UNUSED, uintptr_t symsize ATTRIBUTE_UNUSED)
#define windows_executable_filename()
#define windows_get_executable_path(buf, error_callback, data)
void backtrace_syminfo_to_full_error_callback(void *data, const char *msg, int errnum)
#define FILENAME_BUF_SIZE
#define sysctl_exec_name2(state, error_callback, data)
#define sysctl_exec_name1(state, error_callback, data)
int backtrace_syminfo(struct backtrace_state *state, uintptr_t pc, backtrace_syminfo_callback callback, backtrace_error_callback error_callback, void *data)
#define macho_get_executable_path(state, error_callback, data)
#define hpux_get_executable_path(state, error_callback, data)
int backtrace_pcinfo(struct backtrace_state *state, uintptr_t pc, backtrace_full_callback callback, backtrace_error_callback error_callback, void *data)
#define backtrace_atomic_load_pointer(p)
int(* fileline)(struct backtrace_state *state, uintptr_t pc, backtrace_full_callback callback, backtrace_error_callback error_callback, void *data)
#define backtrace_atomic_load_int(p)
#define backtrace_atomic_store_pointer(p, v)
#define backtrace_atomic_store_int(p, v)
int backtrace_open(const char *filename, backtrace_error_callback error_callback, void *data, int *does_not_exist)
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
Functions to help with cleanup.