我有一个显示字节数组的对话框,用于十六进制编辑它们。可以切换显示的存储区域。但是虽然有些区域是内部数组,但有一些区域是结构,我正在显示它们中的某些元素(连续)。
我想添加一种符号名称功能,选择地址会为您提供名称。对于实际的数组,它由用户完成,用户可以随意调用它们,并将其保存在文件中。但是那些内部结构不应该有用户定义的名称,而是我想给它们硬编码的名称。
问题:是否可以通过了解他们的地址来获取他们的名字?就像,结构Y的字节X指的是变量Z,当选择单元格X时,将其名称显示为“Z”。或者我还必须创建名单并定期使用它们?
编辑:
简化问题:是否存在offsetof()
的向后模拟?通常你传递一个指针和一个变量,它给你该变量的偏移量。所以我需要传递一个指针和一个偏移量,然后获取变量(结构成员)名称(然后用#
对其进行字符串化)。
答案 0 :(得分:1)
据我所知,最好的方法就是在地址区域和名称之间使用地图。
代码应该是这样的:
class address_region{
intptr_t start;
intptr_t end;
template<class T>
address_region(const T& t){
start = (intptr_t)(&t);
end = start + sizeof(t);
}
address_region(intptr_t start_adr=0, intptr_t end_adr=0){
start = start_adr;
end = end_adr;
}
bool operator<(const address_region& adr){
if( adr.start > start ) return true;
else return false;
}
};
map< address_region , std::string > addresses_map;
assume you have this struct;
struct A
{
int X;
int Y;
};
A a;
to store addresses it should be something like :
addresses_map[ address_region(a) ] = "struct A";
addresses_map[ addresses_map(a.X) ] = "struct A : int X";
addresses_map[ addresses_map(a.X) ] = "struct A : int Y";
检索结果:
intptr_t adrs = ....;
std::string symbole_name = addresses_map[ address_region(adrs) ];
答案 1 :(得分:0)
您的编译器应该能够打印map
文件,该文件是符号及其地址(或偏移量)的参考。
看起来您需要在初始化时创建std::map
。地图上会有符号的地址和名称,如下所示:
std::map<uint64_t address, std::string> symbol_dictionary;
您必须在运行时执行此操作,因为某些操作系统会在每次执行时将代码放在不同的地址,具体取决于其他应用程序的内存使用情况(以及内存布局)。
我认为你需要改变你的设计,或重新考虑要求 例如,您可以按名称而不是按地址更改变量吗? 您将在窗口中显示变量名称,并允许用户更改该值。您的程序获取此值并将变量设置为此值。无需知道地址。
出于安全考虑,您不希望用户按地址更改内存。他们可能会更改程序中的错误地址(例如函数中的代码),然后打电话给您,因为您的应用程序不再工作了。
很抱歉,但我有更好的事情要做,而不是支持那些输入地址不正确的人,然后想知道为什么程序不再起作用。
答案 2 :(得分:0)
结束制作符号名称结构的向量(数组指针,开始,大小,名称)并手动添加一串名称。