如何解释GDB中的断点?

时间:2016-05-03 20:48:01

标签: c debugging

我的代码

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

int main()
{
int i=0;
int j=0;
size_t count=0;
float numbers[20][100];
float velocity[21][101];
char *line = NULL;

FILE *myFile;
myFile = fopen("vel.txt", "r");

    if (myFile == NULL)
    {
        printf("Error Reading File\n");
        exit (0);
    }

while(i < 20 && getline(&line, &count, myFile)!=-1) {
int len = 0, pos = 0;
    j = 0;
    while(j < 100 && 1 == sscanf(line + pos, "%f%n", &numbers[i][j++], &len))
        pos += len;
    i++;
}
free(line); 
fclose(myFile);

for( i = 0; i < 21; i++ )
    for( j = 0; j < 101; j++ )
    {
       if( i= 1 && j == 1 )
       {
       velocity[i][j]=numbers[i][j];  
       }
       else if ( i= 1 && j == 101 )
       {
       velocity[i][j]=numbers[i][j];   
       }  
       else if ( i=1 && j >= 2 && j <= 100)
       {
       velocity[i][j]=(numbers[i][j-1]+numbers[i][j])/2;       
       }   
       else if(i >= 2 && i <= 20 && j == 1)
       {
       velocity[i][j]=(numbers[i-1][j]+numbers[i][j])/2;
       }
       else if(i >= 2 && i <= 20 && j == 101)
       {
       velocity[i][j]=(numbers[i-1][j]+numbers[i][j])/2;
       }
       else if(i >= 2 && i <= 20 && j >= 2 && j <= 100) //means i goes from 2,20 j goes from 2,100
       {
       velocity[i][j]=(numbers[i-1][j]+numbers[i][j]+numbers[i][j]+numbers[i][j])/4;
       }     
       else if( i= 21 && j == 1 )
       {
       velocity[i][j]=numbers[i][j];  
       }  
       else if ( i=21 && j >= 2 && j <= 100)
       {
       velocity[i][j]=(numbers[i][j-1]+numbers[i][j])/2;       
       }   
       else 
       {
       velocity[i][j]=numbers[i][j];   
       }
    }

return 0;
}

我可以用gcc编译这个但是exe是runnin gforever.So有些东西是错的。我试着这样调试

Breakpoint 1, main () at a1.c:11
11  char *line = NULL;
(gdb) c
Continuing.

Breakpoint 2, main () at a1.c:35
35         if( i= 1 && j == 1 )
(gdb) c
Continuing.

Breakpoint 2, main () at a1.c:35
35         if( i= 1 && j == 1 )
(gdb) c
Continuing.

Breakpoint 2, main () at a1.c:35
35         if( i= 1 && j == 1 )
(gdb) n
39         else if ( i= 1 && j == 101 )

但我是初学者,这个断点告诉我什么?

2 个答案:

答案 0 :(得分:3)

这是你的问题:

if( i= 1 && j == 1 )

每次循环播放时,您最终会将i重置为1。将其更改为

if ( i == 1 && j == 1 )

避免这种情况的一个常见技巧是将常量表达式放在左侧:

if ( 1 == i && 1 == j )

这样,如果你忘记了=个符号之一,编译器会对你大喊大叫(常量表达式不能作为赋值的目标)。 请注意,我个人并不赞同这种做法 - 我只提到它是一种可能的选择。 IMO,正确要做的是提高编译器的警告级别

修改

关于使用gdb进行调试,所有断点都是在特定指令处停止执行;它实际上并没有告诉你任何事情。但是,它让您有机会检查程序的状态。

要查看特定变量的内容,请使用p命令:

(gdb) p i
(gdb) p j

要检查特定地址的内存,请使用x

(gdb) x/b &i

检查从变量i的地址开始的单个字节:

(gdb) x/32b &i

检查从变量i的地址开始的32个字节。

您还可以使用bt检查堆栈的状态。 Here's一个方便的gdb命令备忘单。

答案 1 :(得分:3)

开启警告。

大多数C编译器默认情况下没有警告。这很不幸,因为它们为调试提供了大量信息。

命令行编译器通常使用-Wall,但通常不会打开所有警告。是的,这很愚蠢。如果您正在使用clang,则可以使用-Weverything来获取所有内容。除了gcc之外,-Wextra还有-Wall。大多数人都-pedantic以确保您遵循标准。

修复所有警告,即使它们看起来很傻。您的代码有一堆很容易修复。

使用valgrind。

在您修复警告后,您可以使用Valgrind等程序查找内存问题。这通常与valgrind ./your_executable一样简单。这将显示你走出分配内存的所有地方,这是C中非常常见的问题。

解释结果可能具有挑战性。 Learn C The Hard Way有一些关于如何做到这一点的信息。

将代码分解为函数并对其进行测试。

这种基本技术适用于任何语言:编写小型可测试函数并测试它们。通过确保每个小部件都可以工作,您只需要担心将它们粘合在一起的代码。

在您的代码中,例如,与velocitynumbers一起使用的巨型for循环应该在它自己的函数中。然后它可以与输入构建`数字的代码。

分开测试

你不需要任何想要进行测试的东西,assert()可以正常工作。 Here's an example from another question