This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: main(), registers and gdb


On Wed, Jan 10, 2007 at 04:32:48PM -0700, Greg Watson wrote:
> If the following code is compiled with 'gcc -g -O0 -o test test.c',  
> the address of argc is passed into func() in the ecx register. Since  
> ecx is not preserved after the call to printf(), the address of argc  
> is corrupted on return from func(). Normally this would not be a  
> problem, since argc is never used in the code.

This is a typical problem.  There is not much that can be done about
it, although I remember once hearing a proposal that GCC should
forcibly extend the live ranges of local variables (or at least
arguments) at -O0 to improve debugging.  That seems sensible to me.

> However, when run under gdb, commands that view the stack frame  
> produce strange results, and some commands (e.g. -var-update)  
> actually crash the debugger.

A crash is always a bug.

>     Breakpoint 1, main (argc=1, argv=0xbffcef14) at test.c:14
>     12              func(&argc);
>     (gdb) n
>     in func
>     14              printf("hello\n");
>     (gdb) where
>     #0  main (argc=Cannot access memory at address 0x4
>     ) at test.c:16

And honestly, I have no idea how that happened.  Does it happen
with a current GDB?  I suspect from the error message that this
one is not too recent.

-- 
Daniel Jacobowitz
CodeSourcery


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]