【问题标题】:Find member by offset按偏移量查找成员
【发布时间】:2015-11-13 16:17:59
【问题描述】:

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

例子:

struct Dummy {
    int a, b, c;
}

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

显然我不想在运行时这样做,所以我一直在玩nmobjdumpgdb 有一段时间了,但没能做到这一点。

【问题讨论】:

  • C++ 中没有反射,但您可以手动将 offesetof 每个成员与您的给定值进行比较,前提是您的类是标准布局。
  • @KerrekSB:嗯,对于一个小类来说,这是可行的,但我实际上有数百个成员、STL 容器等。我希望编译器或其他工具应该能够直接转储内部结构,包括偏移量。
  • 请问您为什么要这样做?
  • 可以用编辑器搜索会员名吗?否则你将需要一个std::map、变量名和成员偏移量。

标签: c++ debugging objdump nm


【解决方案1】:

今天早些时候遇到了同样的问题,

我能找到的最合适的工具是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。

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

或者手动方法:

Mem 将结构设置为零,将相关偏移量设置为 0xFF,在 gdb 中打印结构(使用set print pretty on,这样它就不会将所有内容都放在一个大行上),grep 非零的输出,并希望 STL 漂亮- 打印机不要太困惑。

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

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2014-02-24
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多