#include <stdexcept>
#include <sstream>
-#include "dbg/stack.hpp"
+#include "stack.hpp"
#if defined(_WIN32)
# include <windows.h>
# include <imagehlp.h>
# if defined(__MINGW32__)
+# define PACKAGE 1
+# define PACKAGE_VERSION 1
# include <bfd.h> // link against libbfd and libiberty
# include <psapi.h> // link against psapi
# include <cxxabi.h>
struct find_data
{
std::string func;
+ unsigned int line;
asymbol **symbol_table;
bfd_vma counter;
};
bfd_close(abfd_);
}
- std::string get_function_name(DWORD offset)
+ std::pair<std::string, unsigned int> get_function_name_and_line(DWORD offset)
{
find_data data;
data.symbol_table = symbol_table_;
bfd_map_over_sections(abfd_, &find_function_name_in_section, &data);
- return data.func;
+ return std::make_pair(data.func, data.line);
}
private:
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:
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_);
}
module_name = module_name_raw;
#if defined(__MINGW32__)
- std::string func = bfdc.get_function_name(frame.AddrPC.Offset);
+ std::pair<std::string, unsigned int> 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;
std::string func = got_symbol ? symbol->Name : unknown_function;
#endif
- dbg::stack_frame f(reinterpret_cast<const void *>(frame.AddrPC.Offset), func, module_name);
+ dbg::stack_frame f(reinterpret_cast<const void *>(frame.AddrPC.Offset), func_and_line.first, func_and_line.second, module_name);
frames.push_back(f);
}
}
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)