我试图解析DWARF信息,然后使用该信息使用pin工具从程序中获取局部变量.这是一种像使用pin的GDB类固醇.但是,我很难理解它们对局部变量和分配的寄存器的含义.
例如,
<2>< 1214> DW_TAG_variable
DW_AT_name mts
DW_AT_decl_line 69
DW_AT_type <90>
DW_AT_location DW_OP_breg4+44
Run Code Online (Sandbox Code Playgroud)
我明白,为了从变量mts中获取数据,我必须将44添加到某个寄存器,我的问题是我不确切地说他们正在讨论哪个寄存器.我该怎么解释这个?我在网上找不到任何东西.
另一个例子是DW_OP_fbreg,DW_OP_breg5等等.
任何人都知道他们在x86上下文中谈论哪些寄存器?他们在谈论ebp还是esp?谢谢.
因此,我试图使用libdwarf解析程序的DWARF文件(为此,我必须坚持使用C),我试图从每个DIE专门获取DW_AT_type标记。其中大多数(我不确定是否全部)都是偏移量,我试图找到任何有用的函数来获取这些标记的值。
例:
<2> <286>
DW_AT_type <156>
我在这里想要的是该特定DIE的type属性的156偏移值。
你们知道API是否提供执行此功能的功能吗?
注意:我必须坚持使用C,所以请不要推荐任何python库或对dwarfdumped文件的解析。我只是在寻找一个特定的功能,但是在过去的几天里一直在尝试,并且在文档中找不到任何功能。
我正在使用DWARF和ELF信息的程序中工作.我使用名为Pin的工具迷上了另一个程序.我有来自"Y"程序中声明的全局变量的地址,我把它挂钩到我的Pin模块,我称之为"X".
我得到了一堆这些全局变量的地址.不幸的是,当我试图取消引用它们时,我遇到了麻烦.例如(现在我正在手动操作以查看它是否正在执行应该执行的操作):
char * limit, * address1;
for(address1 = (char *) 0x804A040, limit = address1 + bytesize; address1 < limit; address1++)
cout << *(address1) << "\n";
Run Code Online (Sandbox Code Playgroud)
我应该得到存储在该地址中的变量,该变量是char *一个单词.在这种情况下,我是否必须取消引用两个指针?地址然后char *存储在那个地址?
当我想取消引用一个int变量时,这非常正常,但每当我尝试取消引用一个char指针或变量时,我得到的non-ASCII值......
所以我希望能够在不使用命令行上的任何命令的情况下获得正在运行的进程的完整路径(我有进程ID).任何人对如何做到这一点都有任何想法?
我有PID,是否有任何函数通过传递PID可以返回该进程的完整路径作为char*?
我正在使用调试信息.我试图编写类似"调试信息解析器",我使用DWARF和ELF库来执行此操作,但除了内存空间的信息之外,它们不提供任何内容,我试图获取该内存空间中的数据.我迷上了这个节目.我正在使用一个名为Pin的工具,所以我实际上在其他程序中运行代码.这就是为什么我可以访问它的变量.
假设我有一个指向地址的指针,我想获得存储在该地址和接下来的4个字节中的所有数据(例如).
举一个例子,假设我有一个地址0xDEADBEEF,我想从该地址开始经过接下来的4个字节并读取数据(取消引用每个字节上的指针)
我对C比较陌生,我试图做的是:
char * address = "0xDEADBEEF";
unsigned int bytesize = 4;
ptr = (void *) address;
ptr_limit = ptr + bytesize;
for(ptr; ptr < ptr_limit; ptr++)
cout << ptr;
Run Code Online (Sandbox Code Playgroud)
我知道这可能是完全错误的,我得到了很多编译错误,但它只是展示了我想要使用的一些逻辑......