【问题标题】:Why is GDB showing segmentation fault when GCC is compiling and running fine为什么当 GCC 编译和运行良好时 GDB 显示分段错误
【发布时间】:2019-08-13 08:57:46
【问题描述】:

我正在编写一个小代码来分配空间并在其中读写以测试缓存监控工具。代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define times 2

void write_in_space(int* x, int size){
  printf("\n Entering write in space \n");
  int i;
  for(i = 0; i< size; i++){
    *(x + i) = i;
    i++;
  }
  printf("\n Exiting write_in_space \n");
}

void read_in_space(int* x, int size){

  printf("\n Entering read_in_space \n");
  int i = 0;
  while(i < size){
    *(x + i);
    i++;
  }
  printf("\n Exiting read_in_space \n");
}

void assign_and_work(int k, int l, int m, int mm){

  printf("\n Entering assign_and_work \n");
  int* space;
  space = (int*)malloc(k * sizeof(int));

  if(mm == 3){
  write_in_space(space , k);
  sleep(m);
  read_in_space(space, l);
}

  else if(mm == 1)
    read_in_space(space, l);

  else if(mm == 2)
    write_in_space(space,k);


  printf("\n Exiting assign_and_work \n");
  free(space);

}

//Driver Code

int main(int argc, char **argv){
  int read_space = 0;
  int write_space = 0;
  int sleep_time = 0;
  int i = 1;
  int mode = -1;
  int time = times;
  do{
    if(strcmp(argv[i],"-w") == 0)
      write_space = atoi(argv[i + 1]);
    if(strcmp(argv[i],"-r") == 0)
      read_space = atoi(argv[i + 1]);
    if(strcmp(argv[i],"-s") == 0)
      sleep_time = atoi(argv[i + 1]);
    //if(strcmp(argv[i],"-time") == 0)
      //times = atoi(argv[i + 1]);
    i = i + 1;
  }while( i < argc);

  if(write_space == 0 && read_space > 0)
    mode = 1;
  else if(read_space == 0 && write_space > 0)
    mode = 2;
  else
    mode = 3;

  if((read_space > write_space) && (mode == 3) ){
    write_space = read_space;
  }
    while(time > 0){
    assign_and_work(write_space, read_space, sleep_time, mode);
    time--;
  }


return 0;

}

问题是当我使用命令编译时

gcc -o rw readwrite.c

并运行./rw -r 500000 -w 800000 -s 20 它工作正常。但是当我尝试使用 gdb 时,它会显示以下消息

Program received signal SIGSEGV, Segmentation fault.

__strcmp_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S:31
31  ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S: No such file or directory.
(gdb) 

我无法理解错误。我尝试使用 gdb,因为当我通过 argv 将时间作为用户输入时,它显示核心转储。

 if(strcmp(argv[i],"-time") == 0)
      times = atoi(argv[i + 1]);

请帮助我理解错误。我搜索了很多,但无法弄清楚。 提前谢谢你。

【问题讨论】:

  • 您可以使用bt 获取更多上下文

标签: c segmentation-fault gdb


【解决方案1】:

我猜你没有将参数传递给 GDB,它在第 63 行尝试将不存在的参数与选项进行比较失败。这是失败的根源。

尝试使用不带 args 的程序,看看它也会失败。

如果所有参数都是强制性的,您应该在第 62 行之前放置一个 if 以检查提供的参数数量是否正确。

【讨论】:

  • 是的,完美。这确实是个错误。我使用 gdb --args -r 2000 -w 25000 -s 25 --times 200 运行它,它工作得很好。非常感谢。
  • 结论:总是测试argc
  • @Jabberwocky,好建议,或者使用可以像这样检测空 argv 的系统:segfault.stensal.com/a/QdNbKXQ9lkXL35Pt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多