为什么我的GDB一次执行两个断点?

问题描述 投票:0回答:1

我正在学习使用 GDB 来调试以下有问题的 C 程序:

/*
 * Copyright (c) 2020, Dive into Systems, LLC (https://diveintosystems.org/)
 * Program with some bugs in the findAndReturnMax function
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/***************************************
 * this function should find the largest element in the array and
 * "return" it through max
 *  array: array of integer values
 *  len: size of the array
 *  max: set to the largest value in the array
 *      returns: 0 on success and non-zero on an error
 */
int findAndReturnMax(int *array1, int len, int max) {

    int i;

    if (!array1 || (len <=0) ) {
        return -1;
    }
    max = array1[0];
    for (i=1; i <= len; i++) {
        if (max < array1[i]) {
            max = array1[i];
        }
    }
    return 0;
}

/***************************************/
int main(int argc, char *argv[]) {

    int arr[5] = { 17, 21, 44, 2, 60 };

    int max = arr[0];

    if ( findAndReturnMax(arr, 5, max) != 0 ) {
        printf("strange error\n");
        exit(1);
    }
    printf("max value in the array is %d\n", max);

    return 0;
}

我在第27行设置断点,然后用cont命令执行并打印i的值。为什么结果好像同时执行了两个断点?也就是说,打印出来的i的值为1,2,4,而不是1,2,3,4,5。

tetyang@tet:~/clash/clash/learn_c$ gdb badprog 

(gdb) break 27
Breakpoint 1 at 0x11fc: file badprog.c, line 27.
(gdb) run
Starting program: /home/tetyang/clash/clash/learn_c/badprog 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, findAndReturnMax (array1=0x7fffffffdb30, len=5, max=17) at badprog.c:27
27              max = array1[i];
(gdb) print i
$1 = 1
(gdb) cont
Continuing.

Breakpoint 1, findAndReturnMax (array1=0x7fffffffdb30, len=5, max=21) at badprog.c:27
27              max = array1[i];
(gdb) print i
$2 = 2
(gdb) cont
Continuing.

Breakpoint 1, findAndReturnMax (array1=0x7fffffffdb30, len=5, max=44) at badprog.c:27
27              max = array1[i];
(gdb) print i
$3 = 4
(gdb) cont
Continuing.
max value in the array is 17
[Inferior 1 (process 690122) exited normally]
(gdb) 
c debugging gdb
1个回答
0
投票

您的代码有很多问题。

  1. 未定义的行为
    for (i=1; i <= len; i++) {
  1. 你的函数总是返回

    0
    (当你传递一个非空指针和正数
    len
    时)并且编译器正在优化整个代码。它甚至不需要调用它。

  2. 不需要
  3. max
    参数。如果你想修改它,你需要传递对函数的引用。

  4. 使用正确的尺寸和索引类型。

int findAndReturnMax(const int *array1, size_t len, int * const max) {

    size_t i;
    int result = -1;

    if (array1 && len )
    {
        result = 0;
        for (i = 0; i < len; i++) 
        {
            if (*max < array1[i]) 
            {
                *max = array1[i];
                result = 1;
            }
        }
    }
    return result;
}

int main(int argc, char *argv[]) {

    int arr[5] = { 17, 21, 44, 2, 60 };

    int max = arr[0];

    switch ( findAndReturnMax(arr, 5, &max))
    {
        case -1:
            printf("BAD parameters\n");
            break;
        case 1:
            printf("max value in the array is %d\n", max);
            break;
        default:
            printf("No new max found\n");
    } 

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.