【发布时间】:2020-02-14 19:21:01
【问题描述】:
一个应用程序正在生成一个核心文件。
这里是核心信息。
获取了错误堆栈,目的是检查 myStruct 变量中的数据内容,因为这是在核心发生时传递给 myFunction 的内容。
(gdb) where
#0 0x000000000041bba1 in myFunction (myStruct=0x7ffff9dd0c20) at myTest.c:344
:
:
:
从上面我得到了 myStruct 在 0x7ffff9dd0c20 的地址,并转储了 200 个字。
(gdb) x/200x 0x7ffff9dd0c20
0x7ffff9dd0c20: 0x01938640 0x00000000 0x00001c34 0x000002c8
0x7ffff9dd0c30: 0x00000400 0x00000000 0x01939760 0x00000000
0x7ffff9dd0c40: 0x00000014 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c50: 0x00000000 0x0005000c 0x00000000 0x000d0000
0x7ffff9dd0c60: 0x00000004 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c70: 0x00000000 0x00000000 0x00040000 0x00000000
0x7ffff9dd0c80: 0x0001000c 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c90: 0x00000000 0x00000000 0x00000009 0x00000000
0x7ffff9dd0ca0: 0x00000000 0x00000000 0x410d999a 0x418d999a
0x7ffff9dd0cb0: 0x40b80000 0x41380000 0x000010cc 0x00000000
0x7ffff9dd0cc0: 0x0192edd0 0x00000000 0x00000a30 0x00000158
:
:
:
现在我想验证我是否正确读取了数据的输出。
这是结构信息。
typedef struct
{
char *a;
unsigned int b;
unsigned int c;
int d;
} structA;
typedef struct
{
structA e;
char *f;
} myStruct; <----------This is what gets passed in and what I am trying to examine.
在 Linux 上运行了一个程序来验证数据类型的大小。
Size of char* : 8
Size of int : 4
知道地址是 0x7ffff9dd0c20 并且结构是 myStruct,我假设 我从分析 structA 开始,因为它是第一个。
由于 char *a 是 structA 的第一部分,而 char * 是 2 个单词,我要看看这个:
0x01938640 0x00000000
接下来基本上有 3 个整数(2 个无符号整数和 1 个整数),我从输出中将它们视为这些:
0x00001c34
0x000002c8
0x00000400
这将我带回到 structB 和应该是 2 个单词的 char *f 属性。
这是否意味着这是正确的地址:
0x00000000 0x01939760
我在这里再次复制了内存信息,以便于参考。
(gdb) x/200x 0x7ffff9dd0c20
0x7ffff9dd0c20: 0x01938640 0x00000000 0x00001c34 0x000002c8
0x7ffff9dd0c30: 0x00000400 0x00000000 0x01939760 0x00000000
0x7ffff9dd0c40: 0x00000014 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c50: 0x00000000 0x0005000c 0x00000000 0x000d0000
0x7ffff9dd0c60: 0x00000004 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c70: 0x00000000 0x00000000 0x00040000 0x00000000
0x7ffff9dd0c80: 0x0001000c 0x00000000 0x00000000 0x00000000
0x7ffff9dd0c90: 0x00000000 0x00000000 0x00000009 0x00000000
0x7ffff9dd0ca0: 0x00000000 0x00000000 0x410d999a 0x418d999a
0x7ffff9dd0cb0: 0x40b80000 0x41380000 0x000010cc 0x00000000
0x7ffff9dd0cc0: 0x0192edd0 0x00000000 0x00000a30 0x00000158
这是检查和解析数据的正确方法吗?
这是另一种结构的定义。
typedef struct
{
short w;
unsigned long x;
short y;
short z;
} otherStruct;
这是预期存储在 f 中的内容。
char *f;
在 gdb 中,我尝试了以下操作:
p (otherStruct *)0x1939760
然后打印出来:
$12 = (otherStruct *) 0x1939760
奇怪的是,当我最初打印数据时,它显示 *f 如下,它看起来不像结构:
f = 0x1939760 "\315\314\274@"
【问题讨论】: