This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC 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 Jan 10, 2007, at 4:38 PM, Daniel Jacobowitz wrote:

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.

That would be nice. Although this seems like a trivial issue, it can potentially effect debugging all MPI programs since they always start with 'MPI_Init(&argc, &argv)'.



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.

I believe it's gdb bug #2188.



    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.

It's gdb 6.5, so reasonably recent.


Greg


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