我在基于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.
这是正确的做法吗?如果是的话,我做错了什么?
答案 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);
}