按偏移查找成员

时间:2015-11-13 16:17:59

标签: c++ debugging objdump nm

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

示例:

struct Dummy {
    int a, b, c;
}

如果偏移4并假设为sizeof(int) == 4,我希望得到' b'

显然我不想在运行时这样做,所以我一直在玩nmobjdumpgdb一段时间,但不要设法做到这一点。

1 个答案:

答案 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模块来实现自动化,无论我做什么都很乏味......