unw_accessors_t mc_unw_accessors =
{
- .find_proc_info = &find_proc_info,
- .put_unwind_info = &put_unwind_info,
- .get_dyn_info_list_addr = &get_dyn_info_list_addr,
- .access_mem = &access_mem,
- .access_reg = &access_reg,
- .access_fpreg = &access_fpreg,
- .resume = &resume,
- .get_proc_name = &get_proc_name
+ &find_proc_info,
+ &put_unwind_info,
+ &get_dyn_info_list_addr,
+ &access_mem,
+ &access_reg,
+ &access_fpreg,
+ &resume,
+ &get_proc_name
};
// ***** Context management
int mc_unw_init_context(
mc_unw_context_t context, mc_process_t process, unw_context_t* c)
{
- context->address_space = (mc_address_space_t) process;
+ context->address_space = process;
context->process = process;
// Take a copy of the context for our own purpose:
return -UNW_EUNSPEC;
mc_address_space_t as = context->address_space;
- // Use local unwinding for current process:
- if (MC_is_process(as) && MC_process_is_self((mc_process_t) as))
+ mc_process_t process = dynamic_cast<mc_process_t>(as);
+ if (process && MC_process_is_self(process))
return unw_init_local(cursor, &context->context);
return unw_init_remote(cursor, context->process->unw_addr_space, context);