From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9781 invoked by alias); 12 Jun 2007 03:33:20 -0000 Received: (qmail 9773 invoked by uid 22791); 12 Jun 2007 03:33:19 -0000 X-Spam-Check-By: sourceware.org Received: from py-out-1112.google.com (HELO py-out-1112.google.com) (64.233.166.178) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 12 Jun 2007 03:33:17 +0000 Received: by py-out-1112.google.com with SMTP id a25so1316721pyi for ; Mon, 11 Jun 2007 20:33:15 -0700 (PDT) Received: by 10.64.143.12 with SMTP id q12mr8536071qbd.1181619195520; Mon, 11 Jun 2007 20:33:15 -0700 (PDT) Received: by 10.64.76.7 with HTTP; Mon, 11 Jun 2007 20:33:15 -0700 (PDT) Message-ID: Date: Tue, 12 Jun 2007 03:33:00 -0000 From: kdsfinger@gmail.com To: "Jim Blandy" Subject: Re: gdb breakpoint problem Cc: gdb@sourceware.org In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline References: X-IsSubscribed: yes Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2007-06/txt/msg00085.txt.bz2 On 6/11/07, Jim Blandy wrote: > > kdsfinger@gmail.com writes: > > hi, all > > I am new to gdb and have trouble in setting the breakpoint. The > > problem is, the program does not stop at some of the breakpoints. I am > > using gdb6.6 in centos4.4. Here is the detail. > > > > =================================== > > /* sample.c -- Sample C program to be debugged with ddd > > */ > > #include > > #include > > static void shell_sort(int a[], int size){ > > int i, j; > > int h = 1; > > do { > > h = h * 3 + 1; > > } while (h <= size); > > do { > > h /= 3; > > for (i = h; i < size; i++){ > > int v = a[i]; > > for (j = i; j >= h && a[j - h] > v; j -= h) > > a[j] = a[j - h]; > > if (i != j) > > a[j] = v; > > } > > } while (h != 1); > > } > > > > int main(int argc, char *argv[]){ > > int *a; //line 24 > > int i; //line 25 > > a = (int *)malloc((argc - 1) * sizeof(int)); // line 26 > > for (i = 0; i < argc - 1; i++) > > a[i] = atoi(argv[i + 1]); > > shell_sort(a, argc); > > for (i = 0; i < argc - 1; i++) > > printf("%d ", a[i]); > > printf("\n"); > > free(a); > > return 0; > > } > > ======================================== > > gcc -g -o sample sample.c > > > > gdb sample > > GNU gdb 6.6 > > Copyright (C) 2006 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 "i686-pc-linux-gnu"... > > Using host libthread_db library "/lib/tls/libthread_db.so.1". > > (gdb) break 24 > > Breakpoint 1 at 0x804850b: file sample.c, line 24. > > (gdb) info break 1 > > Num Type Disp Enb Address What > > 1 breakpoint keep y 0x0804850b in main at sample.c:24 > > (gdb) run 2 4 6 3 5 7 > > Starting program: /home/amdx2/drive2/cpp/testddd/sample 2 4 6 3 5 7 > > > > Breakpoint 1, main (argc=7, argv=0xbff515c4) at sample.c:26 > > 26 a = (int *)malloc((argc - 1) * sizeof(int)); > > > > ------------------------- > > As you can see, the program did not stop at the breakpoint on line24. > > It stops at line26. If I add another breakpoint on line25, this 2nd > > breakpoint is skipped as well and the program stops at line26. Why is > > that? How can I correct it? > > First, thanks for providing all the details in your question. Giving > enough information to allow a reader to reproduce the problem > themselves is the right approach. > > What's probably going on is that there is no machine code generated > for lines 24 and 25. They're just declarations. The first actual > machine instruction in main is for line 26, so the 'addresses' of lines > 24, 25, and 26 are probably all the same. > > You can try setting three breakpoints on lines 24, 25, and 26, and > then comparing the addresses printed for each to see if this is the > case. > > > On my own program which is rather big, it got the same problem. When I > > use info break xxx, it sometimes point to a different place in "What". > > For example, I placed the breakpoint in main line 100, but the "what" > > points to other functions in different line. As the result, these > > breakpoints never work. I changed my gcc flags with combinations of > > -glevel -olevel, the problem did not solve. Thanks for your comments. > > Have you tried compiling with no optimization at all (-O0)? When > optimization is enabled, the compiler may inline functions, rearrange > code, or remove it altogether. The debugging information often > doesn't adequately describe these rearrangements, and the debugger > gets confused. > > If you have compiled your program with -O0, and setting a breakpoint > in main still results in the breakpoint's location being reported in > some other function, that sounds like a bug. For us to help you, > you'll need to provide enough information for us to make the problem > happen on our own machines. > Thank you all for your prompt reply. But I am still confused. Here is another toy to demonstrate my problem. ============================== /* Test.cpp -- Test C++ program to be debugged with ddd */ #include #include #include #include class Test{ public: Test(); private: void donothing(); }; void Test::donothing(){ std::string s = "abc"; // line 16 s = s+s; // line 17 std::cout<