【问题标题】:how can I use input file in gdb如何在 gdb 中使用输入文件
【发布时间】:2011-06-21 07:41:28
【问题描述】:

我在编写程序时通常使用输入文件,这样我就免于一次又一次地输入数字的麻烦。

这是我为快速排序编写的一个程序,它的某些地方给了我分段错误

#include<stdio.h>
int partition (int *,int,int);
void quicksort (int *,int,int);
int main()
{
int i,j,a[15],choice;
int length;
printf("Entering numbers in array \n");
for(i=0;i<=14;i++)
scanf("%d",&a[i]);
printf("the sorted array is\n");
length=sizeof(a);
quicksort(a,0,length-1);
for(i=0;i<=14;i++)
 printf (" %d ",a[i]);
}
int partition(int *num,int p,int r)
{
 int x,j,i,temp;
  x=num[r];
  i=-1;
  for(j=0;j<=r-1;j++)
  {
    if(num[j]<=x)
     {
      i=i+1;
       temp=num[i];
       num[i]=num[j];
       num[j]=temp;
     }
  }
  num[i+1]=num[r];
 return i+1;
}


void quicksort (int *num,int p,int r)
{
 int q;
 if (p<r)
  {
        q=partition(num,p,r);
        quicksort(num,p,q-1);
        quicksort(num,q+1,r);
  }
}

这是我的输入文件 input.txt

43 12 90 3 49 108 65 21 9 8 0 71  66 81

当我编译如下

cc quicksort.c
./a.out < input.txt                                          

现在我得到的输出是

Entering numbers in array 
the sorted array is
Segmentation fault

我想知道的是我经常使用 gdb 来调试此类问题。 是否有可能在 gdb 中我从同一个文件 input.txt 中获取输入

我使用 gdb 的命令集是

cc -g quicksort.c
gdb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file a.out
(gdb) break quicksort.c:3
(gdb) run 

现在我想知道的是如何使用gdb中的输入文件,这样我就不会一次又一次地输入我想输入的数组?

【问题讨论】:

标签: c debugging gdb segmentation-fault


【解决方案1】:

在此类“常见”用例中,谷歌始终是您的朋友。

How to load program reading stdin and taking parameters in gdb?

Input redirection in gdb (MinGW)

【讨论】:

    【解决方案2】:

    出于调试目的,将此行添加到您的程序中并注释掉第一个 for 循环

    int a[] = {43, 12, 90, 3, 49, 108, 65, 21, 9, 8, 0, 71, 66, 81};
    

    为了获得最大的调试信息,编译它使用

    gcc -ggdb3 qs.c
    

    并在 gdb 中作为

    运行它
    gdb -q ./a.out 
    

    永远不要退出你的 gdb 会话!如果你重新编译它,gdb 会自动注意到并重新加载二进制文件;这样,您将始终设置断点以及您制作的所有其他内容。

    既然其他人已经给你提示了问题出在哪里,我可能会揭示一个通用宏来获取静态分配数组的大小:-)

    #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
    

    【讨论】:

    • 是的,我知道那个宏是什么,只是想知道我是否没有填充所有 15 个索引并且只填充了数组中的一些数字,那么在这种情况下,你的宏 sizeof(x) 会返回仅由填充位置或所有 15 个位置占用的空间,即 60 个字节。
    • 如果您像a[14] 那样静态分配一个包含14 个项目的数组,那么这就是您将得到的。是否填充数组都没有关系。它将包含未初始化的值,但仍包含 14 个。与 gdb 一样。尝试一下!在 gdb 中,您可以调用任何宏/函数,即键入 p sizeof(a)p sizeof(a)/sizeof(a)[0] 并查看输出
    • 太好了,我明白你的意思了。我只是做了另一个简单的程序来看看你的宏是如何工作的,我没有将数组填充到完整但它给了我完整数组的大小。所以这只是引起了有一个问题,我可以知道有多少个 int 数组的位置已经填充了数字,即我不想知道完整数组的长度,只是输入了多少个数字。
    • 不,不是真的,不是静态的。您可以使用 malloc/realloc 动态分配它。对于静态数组,您可以在启动时使用已知值填充它并检查它,但用户稍后可能会添加该值,从而破坏计数。
    • 问题是关于将输入文件传送到执行中
    【解决方案3】:

    段错误的原因可能是这条线。

    长度=sizeof(a);

    60 岁。

    你的 r 值最大值应该是 15。一个整数被分配了 4 个字节。所以你的电话溢出,因此错误。

    【讨论】:

    • 为什么那一行是错误的?我知道整数是 4 个字节,OO 你的意思是说我应该使用 strlen 而不是 sizeof..
    • 好点。只是想知道我们是否有一个部分填充的数组,然后 sizeof(a)/sizeof(a[0]) 将只返回那些被占用或将返回所有成员的大小15 即 60/4
    • @注册用户。您不能直接在整数类型上使用 strlen 。要获得大小,我建议提前询问大小并将其传递给函数。我也不明白您所说的部分填充数组是什么意思。您将如何区分“填充”数据和“未填充”数据?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多