Как я могу использовать входной файл в GDB - PullRequest
2 голосов
/ 21 июня 2011

Я обычно использую входной файл, когда пишу программы, так что я избавляюсь от хлопот ввода цифр снова и снова.

Вот программа, которую я написал для быстрой сортировки, которая где-то дает мне сегментациюошибка

#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, чтобы я не вводил снова и снова массив, который я хочу ввести?

Ответы [ 3 ]

4 голосов
/ 21 июня 2011
3 голосов
/ 21 июня 2011

В целях отладки добавьте эту строку в вашу программу и закомментируйте первый цикл 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]))
0 голосов
/ 21 июня 2011

Причиной ошибки seg может быть эта строка.

length = sizeof (a);

Его 60.

Ваше максимальное значение r должно быть 15.целое число выделяется 4 байта.Таким образом, ваш вызов переполнен, следовательно, ошибка.

...