0

我有一个(大)类和该类的偏移量。如何有效地找到在该偏移处定义的成员?

例子:

struct Dummy {
    int a, b, c;
}

给定一个偏移量4并假设sizeof(int) == 4,我想得到'b'。

显然我不想在运行时这样做,所以我一直在玩nm,现在objdumpgdb一段时间了,但没有设法做到这一点。

4

1 回答 1

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< char>。

我还发现了 pstruct(比 pahole 更容易混淆,根本不接受 C++)、Clang -cc1 -fdump-record-layouts(它给了我一堆指向 Clang 的地址空间的指针,但没有偏移量)和MSVC -d1reportAllClassLayout(当我尝试时,那个标志没有任何区别)。

或手动方法:

Mem 将结构设置为零,将相关偏移设置为 0xFF,在 gdb 中打印结构(使用set print pretty on它不会将所有内容放在一个大行上),grep 非零的输出,并希望 STL 漂亮的打印机不会得到太糊涂了。

也许我应该做一个 GDB 模块来自动化这个,不管我做什么都很乏味......

于 2017-03-24T22:44:11.760 回答