From: Edd D. <li...@mr...> - 2007-09-15 01:08:30
|
Hi all, I think I have come across a bug in either addr2line or libbfd as distributed with MinGW 3.4.5. It is unable to resolve the symbol names for static functions in instantiations of template classes (or at least the subset of these that I'm interested in). It works fine for template functions. But I could be doing something completely bogus. The code: #include <windows.h> #include <imagehlp.h> #include <iostream> #include <cstring> void dump_frames() { STACKFRAME frame; std::memset(&frame, 0, sizeof frame); CONTEXT context; std::memset(&context, 0, sizeof context); context.ContextFlags = CONTEXT_FULL; typedef void (WINAPI *func_type)(PCONTEXT); func_type rtlcc = 0; if (HMODULE k32 = LoadLibrary("kernel32.dll")) { rtlcc = (func_type)GetProcAddress(k32, "RtlCaptureContext"); if (rtlcc) rtlcc(&context); FreeLibrary(k32); } if (!rtlcc) return; frame.AddrPC.Offset = context.Eip; frame.AddrPC.Mode = AddrModeFlat; frame.AddrStack.Offset = context.Esp; frame.AddrStack.Mode = AddrModeFlat; frame.AddrFrame.Offset = context.Ebp; frame.AddrFrame.Mode = AddrModeFlat; HANDLE process = GetCurrentProcess(); HANDLE thread = GetCurrentThread(); char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; IMAGEHLP_SYMBOL *symbol = (IMAGEHLP_SYMBOL *)symbol_buffer; while(StackWalk(IMAGE_FILE_MACHINE_I386, process, thread, &frame, &context, 0, &SymFunctionTableAccess, &SymGetModuleBase, 0 )) { symbol->SizeOfStruct = (sizeof *symbol) + 255; symbol->MaxNameLength = 254; std::cout << std::hex << frame.AddrPC.Offset << '\n'; } } void e() { dump_frames(); } void d() { e(); } void c() { d(); } void b() { c(); } void a() { b(); } template<unsigned Depth> void recurse_func() { recurse_func<Depth - 1>(); } template<> void recurse_func<0>() { dump_frames(); } template<unsigned Depth> struct recurse { static void call() { recurse<Depth - 1>::call(); } }; template<> struct recurse<0> { static void call() { dump_frames(); } }; int main() { a(); std::cout << "-----\n"; recurse_func<5>(); std::cout << "-----\n"; recurse<5>::call(); return 0; } cmd.exe session: P:\guff>g++ mingwtrace.cpp -o mingwtrace -W -Wall -ansi -pedantic -ggdb3 -limagehlp P:\guff>mingwtrace.exe 4015d7 4015e5 4015f3 401601 40160f 40164f 40124b 401298 7c816fd7 ----- 40161d 4126bb 4126cb 4126db 4126eb 4126fb 401668 40124b 401298 7c816fd7 ----- 41270b 41271b 41272b 41273b 41274b 41275b 401681 40124b 401298 7c816fd7 P:\guff>addr2line -f -e mingwtrace.exe 0x4015d7 _Z1ev P:\guff/mingwtrace.cpp:48 P:\guff>addr2line -f -e mingwtrace.exe 0x40161d _Z12recurse_funcILj0EEvv P:\guff/mingwtrace.cpp:64 P:\guff>addr2line -f -e mingwtrace.exe 0x41270b ?? P:\guff/mingwtrace.cpp:75 P:\guff> See the "??" towards the end. Is this an issue? Or am I doing something fundamentally wrong? Any help would be greatly appreciated. Thanks, Edd |