本文整理汇总了C++中lldb::StackFrameSP::GetRegisterContext方法的典型用法代码示例。如果您正苦于以下问题:C++ StackFrameSP::GetRegisterContext方法的具体用法?C++ StackFrameSP::GetRegisterContext怎么用?C++ StackFrameSP::GetRegisterContext使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类lldb::StackFrameSP
的用法示例。
在下文中一共展示了StackFrameSP::GetRegisterContext方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Materialize
void Materialize(lldb::StackFrameSP &frame_sp, IRMemoryMap &map,
lldb::addr_t process_address, Status &err) override {
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
const lldb::addr_t load_addr = process_address + m_offset;
if (log) {
log->Printf("EntityRegister::Materialize [address = 0x%" PRIx64
", m_register_info = %s]",
(uint64_t)load_addr, m_register_info.name);
}
RegisterValue reg_value;
if (!frame_sp.get()) {
err.SetErrorStringWithFormat(
"couldn't materialize register %s without a stack frame",
m_register_info.name);
return;
}
lldb::RegisterContextSP reg_context_sp = frame_sp->GetRegisterContext();
if (!reg_context_sp->ReadRegister(&m_register_info, reg_value)) {
err.SetErrorStringWithFormat("couldn't read the value of register %s",
m_register_info.name);
return;
}
DataExtractor register_data;
if (!reg_value.GetData(register_data)) {
err.SetErrorStringWithFormat("couldn't get the data for register %s",
m_register_info.name);
return;
}
if (register_data.GetByteSize() != m_register_info.byte_size) {
err.SetErrorStringWithFormat(
"data for register %s had size %llu but we expected %llu",
m_register_info.name, (unsigned long long)register_data.GetByteSize(),
(unsigned long long)m_register_info.byte_size);
return;
}
m_register_contents.reset(new DataBufferHeap(register_data.GetDataStart(),
register_data.GetByteSize()));
Status write_error;
map.WriteMemory(load_addr, register_data.GetDataStart(),
register_data.GetByteSize(), write_error);
if (!write_error.Success()) {
err.SetErrorStringWithFormat(
"couldn't write the contents of register %s: %s",
m_register_info.name, write_error.AsCString());
return;
}
}
示例2: Dematerialize
void Dematerialize(lldb::StackFrameSP &frame_sp, IRMemoryMap &map,
lldb::addr_t process_address, lldb::addr_t frame_top,
lldb::addr_t frame_bottom, Status &err) override {
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
const lldb::addr_t load_addr = process_address + m_offset;
if (log) {
log->Printf("EntityRegister::Dematerialize [address = 0x%" PRIx64
", m_register_info = %s]",
(uint64_t)load_addr, m_register_info.name);
}
Status extract_error;
DataExtractor register_data;
if (!frame_sp.get()) {
err.SetErrorStringWithFormat(
"couldn't dematerialize register %s without a stack frame",
m_register_info.name);
return;
}
lldb::RegisterContextSP reg_context_sp = frame_sp->GetRegisterContext();
map.GetMemoryData(register_data, load_addr, m_register_info.byte_size,
extract_error);
if (!extract_error.Success()) {
err.SetErrorStringWithFormat("couldn't get the data for register %s: %s",
m_register_info.name,
extract_error.AsCString());
return;
}
if (!memcmp(register_data.GetDataStart(), m_register_contents->GetBytes(),
register_data.GetByteSize())) {
// No write required, and in particular we avoid errors if the register
// wasn't writable
m_register_contents.reset();
return;
}
m_register_contents.reset();
RegisterValue register_value(
const_cast<uint8_t *>(register_data.GetDataStart()),
register_data.GetByteSize(), register_data.GetByteOrder());
if (!reg_context_sp->WriteRegister(&m_register_info, register_value)) {
err.SetErrorStringWithFormat("couldn't write the value of register %s",
m_register_info.name);
return;
}
}