28#include "dbus-internals.h"
29#include "dbus-sysdeps.h"
31#if !defined (DBUS_DISABLE_ASSERT) || defined(DBUS_ENABLE_EMBEDDED_TESTS)
33#if defined(_MSC_VER) || defined(DBUS_WINCE)
42#include "dbus-sysdeps-win.h"
48#define DPRINTF(fmt, ...) fprintf (stderr, fmt, ##__VA_ARGS__)
56static void dump_backtrace_for_thread (HANDLE hThread)
64 SymSetOptions (SYMOPT_UNDNAME | SYMOPT_LOAD_LINES);
65 SymInitialize (GetCurrentProcess (),
NULL,
TRUE);
70 if (hThread == GetCurrentThread())
73 DPRINTF (
"Backtrace:\n");
77 context.ContextFlags = CONTEXT_FULL;
79 SuspendThread (hThread);
81 if (!GetThreadContext (hThread, &context))
83 DPRINTF (
"Couldn't get thread context (error %ld)\n", GetLastError ());
84 ResumeThread (hThread);
91 dwImageType = IMAGE_FILE_MACHINE_I386;
92 sf.AddrFrame.Offset = context.Ebp;
93 sf.AddrFrame.Mode = AddrModeFlat;
94 sf.AddrPC.Offset = context.Eip;
95 sf.AddrPC.Mode = AddrModeFlat;
97 dwImageType = IMAGE_FILE_MACHINE_AMD64;
98 sf.AddrPC.Offset = context.Rip;
99 sf.AddrPC.Mode = AddrModeFlat;
100 sf.AddrFrame.Offset = context.Rsp;
101 sf.AddrFrame.Mode = AddrModeFlat;
102 sf.AddrStack.Offset = context.Rsp;
103 sf.AddrStack.Mode = AddrModeFlat;
104#elif defined(_M_IA64)
105 dwImageType = IMAGE_FILE_MACHINE_IA64;
106 sf.AddrPC.Offset = context.StIIP;
107 sf.AddrPC.Mode = AddrModeFlat;
108 sf.AddrFrame.Offset = context.IntSp;
109 sf.AddrFrame.Mode = AddrModeFlat;
110 sf.AddrBStore.Offset= context.RsBSP;
111 sf.AddrBStore.Mode = AddrModeFlat;
112 sf.AddrStack.Offset = context.IntSp;
113 sf.AddrStack.Mode = AddrModeFlat;
114#elif defined(_M_ARM64)
115 dwImageType = IMAGE_FILE_MACHINE_ARM64;
116 sf.AddrPC.Offset = context.Pc;
117 sf.AddrPC.Mode = AddrModeFlat;
118 sf.AddrFrame.Offset = context.Fp;
119 sf.AddrFrame.Mode = AddrModeFlat;
120 sf.AddrStack.Offset = context.Sp;
121 sf.AddrStack.Mode = AddrModeFlat;
123# error You need to fill in the STACKFRAME structure for your architecture
132 while (StackWalk (dwImageType, GetCurrentProcess (),
133 hThread, &sf, &context,
NULL, SymFunctionTableAccess,
134 SymGetModuleBase,
NULL))
136 char buffer[
sizeof(SYMBOL_INFO) + MAX_SYM_NAME *
sizeof(
char)];
137 PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
138 DWORD64 displacement;
140 DWORD dwDisplacement;
141 IMAGEHLP_MODULE moduleInfo;
149 if (old_address.Offset == sf.AddrPC.Offset)
155 pSymbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
156 pSymbol->MaxNameLen = MAX_SYM_NAME;
158 if (SymFromAddr (GetCurrentProcess (), sf.AddrPC.Offset, &displacement, pSymbol))
161 DPRINTF (
"%3d %s+0x%I64x", i++, pSymbol->Name, displacement);
163 DPRINTF (
"%3d %s", i++, pSymbol->Name);
166 DPRINTF (
"%3d 0x%Ix", i++, sf.AddrPC.Offset);
168 line.SizeOfStruct =
sizeof(IMAGEHLP_LINE);
169 if (SymGetLineFromAddr (GetCurrentProcess (), sf.AddrPC.Offset, &dwDisplacement, &line))
171 DPRINTF (
" [%s:%ld]", line.FileName, line.LineNumber);
174 moduleInfo.SizeOfStruct =
sizeof(moduleInfo);
175 if (SymGetModuleInfo (GetCurrentProcess (), sf.AddrPC.Offset, &moduleInfo))
177 DPRINTF (
" in %s", moduleInfo.ModuleName);
180 old_address = sf.AddrPC;
182 ResumeThread (hThread);
185static DWORD WINAPI dump_thread_proc (LPVOID lpParameter)
187 dump_backtrace_for_thread ((HANDLE) lpParameter);
196 HANDLE hCurrentThread;
199 DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
200 GetCurrentProcess (), &hCurrentThread,
201 0,
FALSE, DUPLICATE_SAME_ACCESS);
202 hThread = CreateThread (
NULL, 0, dump_thread_proc, (LPVOID)hCurrentThread,
204 WaitForSingleObject (hThread, INFINITE);
205 CloseHandle (hThread);
206 CloseHandle (hCurrentThread);
219 _dbus_verbose (
" D-Bus not compiled with backtrace support\n");
#define _DBUS_ZERO(object)
Sets all bits in an object to zero.
#define NULL
A null pointer, defined appropriately for C or C++.
#define TRUE
Expands to "1".
#define FALSE
Expands to "0".
void _dbus_print_backtrace(void)
On GNU libc systems, print a crude backtrace to stderr.