拆卸C代码并检查堆栈

时间:2019-04-18 12:35:05

标签: c memory gdb

因此,我有一些简单的C代码可创建大小为512字节的缓冲区:

 #include <sys/types.h>
 #include <netinet/in.h>

 #include <stdio.h>
 #include <ctype.h>

 main(argc, argv)
      char *argv[];
 {
    char line[512];
    gets(line);
 }

这是否意味着该缓冲区正好为堆栈分配了512个字节?在GDB中,有没有一种方法可以分解已编译的二进制文件,我们可以看到类似的

  • 堆栈和返回地址之间的距离
  • 什么参数传递给'gets()'函数..例如地址?

我尝试通过GDB逐步解决此问题,但是找不到找到这种检查的方法

2 个答案:

答案 0 :(得分:0)

您可以签出“ strace”命令行工具。它将列出所有内部系统调用和相应的参数。它还将使您了解正在分配多少内存。

请注意,您应谨慎使用gets,因为它不会检查缓冲区溢出。

在手册页中:

gets()从stdin读取一行到s所指向的缓冲区,直到终止换行符或EOF为止        替换为“ \ 0”。不检查缓冲区溢出(请参见下面的错误)。

答案 1 :(得分:-1)

如果需要,可以使用printf显示内存地址,例如:

#include <stdio.h>
int main() {
  char line1[512];
  char line2[512];
  char line3[512];
  printf("line1 ptr: %p\n", line1);
  printf("line2 ptr: %p\n", line2);
  printf("line3 ptr: %p\n", line3);
  long int diff = line3 - line1;
  printf("diff between line3 and line1 : %ld\n", diff);
  return 0;
}

如果运行该命令,则可能会看到line1,line2和line1的内存位置之间恰好有512个字节,如果编译器选择以此方式将其放置在内存中。