c - 如何获取结构转储中字段的相对地址。 [C]

标签 c field dump

我们正在研究在 Linux 下使用 arm-eabi-gcc 编译的 C 程序。

我们正在使用一个大型结构的转储,我们在确定应该在哪个地址读取我们结构的各个字段(比如其中的 50 个)时遇到问题,(内存对齐和填充对我来说不是那么可预测).

有什么方法可以获取我们的编译器生成的结构的内存映射。 gdb 中的一个选项?或者有什么工具可以帮助我们在转储中找到字段和地址之间的对应关系?

最佳答案

您可以使用 gdb 来完成。作为示例,我将使用此来源:

struct A {
  int a;
  char b;
  short c;
};

int main() {
  struct A a;
}

gdb 中加载二进制文件:

(gdb) print (int)&((struct A*)0)->a
$1 = 0
(gdb) print (int)&((struct A*)0)->b
$2 = 4
(gdb) print (int)&((struct A*)0)->c
$3 = 6

更新:

如果您需要为大量字段执行此操作,那么您可能会发现使用 GDB 的新 python 接口(interface)会很方便(您需要最新版本的 GDB 才能使用它,我使用的是 7.4)。我创建了 offsets.py:

import gdb

class Offsets(gdb.Command):
    def __init__(self):
        super (Offsets, self).__init__ ('offsets-of', gdb.COMMAND_DATA)

    def invoke(self, arg, from_tty):
        argv = gdb.string_to_argv(arg)
        if len(argv) != 1:
            raise gdb.GdbError('offsets-of takes exactly 1 argument.')

        stype = gdb.lookup_type(argv[0])

        print argv[0], '{'
        for field in stype.fields():
            print '    %s => %d' % (field.name, field.bitpos//8)
        print '}'

Offsets()

然后你可以添加到你的.gdbinit:

python
sys.path.insert(0, '/path/to/script/dir')
import offsets
end

然后在 GDB 中使用它,例如:

(gdb) offsets-of "struct A"
struct A {
    a => 0
    b => 4
    c => 6
}

此脚本做了一些简化假设,例如您不使用位域,并且它不深入嵌套结构,但如果您需要,这些更改非常简单。

关于c - 如何获取结构转储中字段的相对地址。 [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9788679/

相关文章:

javascript - PHP 中 var_dump 或 print_r 的 JavaScript 等价物是什么?

python - 使用 Python sqlite3 API 的表、数据库模式、转储等列表

mysql - 导入大数据库到docker时写入错误

c - 函数声明为静态但从未定义

python - Django 从 _meta.get_field 添加多对多关系

python - 自定义 django 小部件 - decompress() arg 未填充

c++ - 如何在 C++ 程序中使用长度指示器

c - 什么是 *ABS* 部分以及何时使用?

c - 来自 C 函数的字符串

c - 以空终止符结尾的字符串文字是否包含额外的空终止符?