0

我有一个在基于 ARM 的嵌入式设备上运行的程序。某个struct全局可访问的,每隔一段时间就会被转储到磁盘,代表大约 160Kb 的数据。

我需要检查这个结构的内容。到目前为止,我已经使用 Python 脚本和struct库来解析该转储的内容,但是这种方法不能很好地扩展。

我认为可以使用交叉编译的 GDB 程序来执行此操作。我想将该文件的内容复制回内存中的结构地址。所以这就是我尝试的:

$ arm-eabi-gdb
....
(gdb) target sim
Connected to the simulator.
(gdb) file MS.elf
Reading symbols from MS.elf...done.
(gdb) p &my_struct
$1 = (MyStruct *) 0x6801149c
(gdb) restore ~/Dumps/MS_20121128_164606 binary 0x6801149c
You can't do that without a process to debug.

这是正确的方法吗?如果是,我做错了什么?

4

1 回答 1

0

我会编写一个小程序,读取结构,然后在调试模式下打印它。

该程序需要在与 ARM 架构特征相同的系统上编译。即相同大小的char、int、short、long、float、double 和pointer。此外,字节顺序需要与 ARM 上的相同。

如果您经常查看结构,那么打印出结构的内容而不是不断使用 gdb 来查看内容是值得的。

由于结构非常大,我还需要额外的步骤,使用 API 将结构放入浏览器中的文件夹/文档类型树中,以便您可以放大或浏览结构的不同部分。如果有人对此感兴趣,请告诉我。

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>   
#include <stdlib.h>

struct Foo {       
    /* contents of the struct go here */
};        

int
main()
{     
    struct Foo tmp;
    int fd, r, n = sizeof(tmp);

    fd = open("struct_dump", O_RDONLY);
    if (fd < 0) {
        printf("could not open struct_dump.\n");
        exit(0);
    }

    r = read(fd, &tmp, n);
    if (r != n) {
        printf("mismatched struct sizes.\n");
        exit(0);
    }

    /*
     * Stop here in gdb and do 'p tmp'
     */

    close(fd);
    exit(0);
 }          
于 2012-12-03T21:13:28.183 回答