我有一个(大)类和该类的偏移量。 如何有效地找到在该偏移处定义的成员?
示例:
struct Dummy {
int a, b, c;
}
如果偏移4
并假设为sizeof(int) == 4
,我希望得到' b'
显然我不想在运行时这样做,所以我一直在玩nm
,objdump
和gdb
一段时间,但不要设法做到这一点。
答案 0 :(得分:2)
今天早些时候遇到同样的问题,
我能找到的最合适的工具是pahole。用法示例:
$ cat dummy.cpp
#include <string>
struct Dummy {
int a, b, c;
std::string d;
};
struct Dummy x; // gcc doesn't emit debug info for unused stuff
$ g++ -c dummy.cpp -ggdb3
$ pahole dummy.o
die__process_class: tag not supported (template_type_parameter)!
//trimmed structs __va_list_tag, tm and lconv
struct Dummy {
int a; /* 0 4 */
int b; /* 4 4 */
int c; /* 8 4 */
string d; /* 16 8 */
//trimmed some constructors
};
不幸的是,它没有打印模板内容,比如std :: string aka std :: basic_string&lt;炭&GT;
我还发现pstruct(比pahole容易混淆,根本不接受C ++),Clang -cc1 -fdump-record-layouts(它给了我一堆指向Clang地址空间的指针,但没有偏移)和MSVC -d1reportAllClassLayout(当我尝试时,那个标志没有任何区别。)
或手动方法:
将struct设置为零,将相关偏移设置为0xFF,在gdb中打印struct(使用set print pretty on
,这样它就不会将所有内容都放在一个巨大的行上),grep非零的输出,以及希望STL漂亮的打印机不要太困惑。
也许我应该制作一个GDB模块来实现自动化,无论我做什么都很乏味......