X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fstack.cpp;h=a8183d3444c7c426f47fcbcc3d60b70548039f47;hb=3574212ee42b2bd924eb95d5c0f4f69ec9e0a2f0;hp=b3479b1bb174160fd9379420d116dd5a93da48d9;hpb=48501fb37dd46c2e9f6f016dd987b13e61dd476a;p=dcpomatic.git diff --git a/src/lib/stack.cpp b/src/lib/stack.cpp index b3479b1bb..a8183d344 100644 --- a/src/lib/stack.cpp +++ b/src/lib/stack.cpp @@ -11,13 +11,15 @@ #include #include -#include "dbg/stack.hpp" +#include "stack.hpp" #if defined(_WIN32) # include # include # if defined(__MINGW32__) +# define PACKAGE 1 +# define PACKAGE_VERSION 1 # include // link against libbfd and libiberty # include // link against psapi # include @@ -77,6 +79,7 @@ namespace struct find_data { std::string func; + unsigned int line; asymbol **symbol_table; bfd_vma counter; }; @@ -125,7 +128,7 @@ namespace bfd_close(abfd_); } - std::string get_function_name(DWORD offset) + std::pair get_function_name_and_line(DWORD offset) { find_data data; data.symbol_table = symbol_table_; @@ -133,7 +136,7 @@ namespace bfd_map_over_sections(abfd_, &find_function_name_in_section, &data); - return data.func; + return std::make_pair(data.func, data.line); } private: @@ -154,8 +157,10 @@ namespace const char *file = 0; unsigned line = 0; - if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) + if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) { data.func = demangle(func); + data.line = line; + } } private: @@ -192,7 +197,7 @@ namespace public: explicit windows_dll(const std::string &libname) : name_(libname), - lib_(LoadLibrary(name_.c_str())) + lib_(LoadLibraryA(name_.c_str())) { if (!lib_) throw std::runtime_error("Failed to load dll " + name_); } @@ -325,13 +330,17 @@ namespace module_name = module_name_raw; #if defined(__MINGW32__) - std::string func = bfdc.get_function_name(frame.AddrPC.Offset); + std::pair func_and_line = bfdc.get_function_name_and_line(frame.AddrPC.Offset); - if (func.empty()) + if (func_and_line.first.empty()) { +#if defined(_WIN64) + DWORD64 dummy = 0; +#else DWORD dummy = 0; +#endif BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &dummy, symbol); - func = got_symbol ? symbol->Name : unknown_function; + func_and_line.first = got_symbol ? symbol->Name : unknown_function; } #else DWORD dummy = 0; @@ -339,7 +348,7 @@ namespace std::string func = got_symbol ? symbol->Name : unknown_function; #endif - dbg::stack_frame f(reinterpret_cast(frame.AddrPC.Offset), func, module_name); + dbg::stack_frame f(reinterpret_cast(frame.AddrPC.Offset), func_and_line.first, func_and_line.second, module_name); frames.push_back(f); } } @@ -415,16 +424,17 @@ namespace namespace dbg { - stack_frame::stack_frame(const void *instruction, const std::string &function, const std::string &module) : + stack_frame::stack_frame(const void *instruction, const std::string &function, unsigned int line, const std::string &module) : instruction(instruction), function(function), + line(line), module(module) { } std::ostream &operator<< (std::ostream &out, const stack_frame &frame) { - return out << frame.instruction << ": " << frame.function << " in " << frame.module; + return out << frame.instruction << ": " << frame.function << ":" << frame.line << " in " << frame.module; } stack::stack(depth_type limit)