如何检查已转储到文件的交叉编译结构?

时间:2012-11-28 19:53:51

标签: c debugging gdb embedded cross-compiling

我在基于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.

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

1 个答案:

答案 0 :(得分: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);
 }