我正在学习使用 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)
您的代码有很多问题。
for (i=1; i <= len; i++) {
你的函数总是返回
0
(当你传递一个非空指针和正数len
时)并且编译器正在优化整个代码。它甚至不需要调用它。
max
参数。如果你想修改它,你需要传递对函数的引用。
使用正确的尺寸和索引类型。
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;
}