我有一个(大)类和该类的偏移量。如何有效地找到在该偏移处定义的成员?
例子:
struct Dummy {
int a, b, c;
}
给定一个偏移量4
并假设sizeof(int) == 4
,我想得到'b'。
显然我不想在运行时这样做,所以我一直在玩nm
,现在objdump
有gdb
一段时间了,但没有设法做到这一点。
今天早些时候遇到了同样的问题,
我能找到的最合适的工具是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< char>。
我还发现了 pstruct(比 pahole 更容易混淆,根本不接受 C++)、Clang -cc1 -fdump-record-layouts(它给了我一堆指向 Clang 的地址空间的指针,但没有偏移量)和MSVC -d1reportAllClassLayout(当我尝试时,那个标志没有任何区别)。
或手动方法:
Mem 将结构设置为零,将相关偏移设置为 0xFF,在 gdb 中打印结构(使用set print pretty on
它不会将所有内容放在一个大行上),grep 非零的输出,并希望 STL 漂亮的打印机不会得到太糊涂了。
也许我应该做一个 GDB 模块来自动化这个,不管我做什么都很乏味......