From: | Clover White <mywhiteclover(at)gmail(dot)com> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | why was the VAR 'optind' never changed in initdb? |
Date: | 2012-04-09 11:38:46 |
Message-ID: | CAEwsEE48V3aa7oPQhNBz3S28rABbXuTasOGDPf=hoRVJy2A4fw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
I'm debugging initdb using gdb.
I found that I could not step in the function getopt_long in line 2572 in
initdb.c.
I also found that the value of VAR optind never be changed. VAR optind is
always equal to 1 but how could optind be larger than the value of argc(the
value of argc is 6) in line 2648 and 2654.
I was so confused. Could someone give me some help? Thank you~
here is my configure:
./configure CFLAGS=-O0 --enable-debug --enable-depend --enable-cassert
--prefix=/home/pgsql/pgsql
follows is my debug log by gdb:
[pgsql(at)vmlinux postgresql-9.1.2]$ gdb initdb
GNU gdb Red Hat Linux (6.3.0.0-1.63rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host
libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) set args -U pgsql -W -D /home/pgsql/pg_data
(gdb) b main
Breakpoint 1 at 0x804d133: file initdb.c, line 2553.
(gdb) b 2572
Breakpoint 2 at 0x804d20c: file initdb.c, line 2572.
(gdb) run
Starting program: /home/pgsql/pgsql/bin/initdb -U pgsql -W -D
/home/pgsql/pg_data
Breakpoint 1, main (argc=6, argv=0xbfec0ad4) at initdb.c:2553
2553 progname = get_progname(argv[0]);
(gdb) c
Continuing.
Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p optind
$1 = 1
(gdb) s
2574 switch (c)
(gdb) n
2589 username = xstrdup(optarg);
(gdb)
2590 break;
(gdb) p optind
$2 = 1
(gdb) n
Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p optind
$3 = 1
(gdb) n
2574 switch (c)
(gdb) p optind
$4 = 1
(gdb) n
2586 pwprompt = true;
(gdb)
2587 break;
(gdb)
Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p optind
$5 = 1
(gdb) n
2574 switch (c)
(gdb)
2580 pg_data = xstrdup(optarg);
(gdb) p optarg
$6 = 0x0
(gdb) n
2581 break;
(gdb) p optarg
$7 = 0x0
(gdb) n
Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p pg_data
$8 = 0x9d328e8 "/home/pgsql/pg_data"
(gdb) n
2648 if (optind < argc)
(gdb) p optind
$9 = 1
(gdb) p argc
$10 = 6
(gdb) n
2654 if (optind < argc)
(gdb) p optind
$11 = 1
(gdb) p argc
$12 = 6
(gdb) n
2663 if (pwprompt && pwfilename)
(gdb)
--
Clover White
From | Date | Subject | |
---|---|---|---|
Next Message | Andrew Dunstan | 2012-04-09 12:49:44 | Re: why was the VAR 'optind' never changed in initdb? |
Previous Message | Ashutosh Bapat | 2012-04-09 11:19:59 | Potential for bugs while using COPY_POINTER_FIELD to copy NULL pointer |