dwarfinterpret/test/dump_my_stack.cpp
Théophile Bastian c4895ed0d1 Make context acquisition behave correctly wrt. calling site
It now actually returns the context at the call site of the function,
instead of somewhere inside DwarfInterpret
2018-04-06 16:26:24 +02:00

56 lines
1.4 KiB
C++

#include <cstdio>
#include <dlfcn.h>
#include <DwarfInterpret.hpp>
using namespace std;
volatile int optim_stopper = 0;
void dump_my_stack() {
DwarfInterpret& dw = DwarfInterpret::acquire();
DwarfInterpret::UnwindContext unw_context =
DwarfInterpret::get_current_unwind_context();
MemoryMap mmap;
while(true) {
Dl_info dl_inf;
int dl_rc = dladdr((void *) unw_context.rip, &dl_inf);
printf(">> PC = %lX ", unw_context.rip);
MemoryMap::MapEntry cur_map_entry =
mmap[mmap.id_of_address(unw_context.rip)];
uintptr_t inelf_pc = unw_context.rip
- cur_map_entry.mem_region.begin + cur_map_entry.offset;
printf("(in ELF: 0x%lX, func %s, path %s) <<\n",
inelf_pc,
(dl_rc && dl_inf.dli_sname) ? dl_inf.dli_sname : "(no symbol)",
cur_map_entry.pathname.c_str());
fflush(stdout);
unw_context = dw.unwind_context(unw_context);
}
}
void fill_my_stack(int stack_depth) {
if(stack_depth == 0)
dump_my_stack();
fill_my_stack(stack_depth - 1);
}
int main(int argc, char** argv) {
MemoryMap mmap;
cout << "Dumping memory map… (" << mmap.size() << " entries)" << endl;
for(const auto& entry: mmap) {
entry.dump(cout);
}
cout << "End memory map" << endl;
int stack_depth = 5;
if(argc >= 2)
stack_depth = atoi(argv[1]);
fill_my_stack(stack_depth);
return 0;
}