Wrong debug info for argc at -O2

Simon Marchi simark@simark.ca
Mon Jun 22 18:14:10 GMT 2020


On 2020-05-29 11:58 a.m., 杨已彪 wrote:
> 
> 
> Consider test-case:
> ...
> $ cat small.c
> #include <stdio.h>
> 
> int main(int argc, char **argv) {
>   char buf[6];
>   char c[] = "abc";
>   sprintf(buf, (char *)c, 1);
> 
>   return 0;
> }
> ...
> 
> 
> Stepping with step and print the values of arguments:
> ...
> $ gcc -O2 -g small.c; gdb -q a.out
> Reading symbols from a.out...
> (gdb) b main
> Breakpoint 1 at 0x401040: file small.c, line 5.
> (gdb) r
> Starting program: /home/yibiao/Debugger/a.out
> 
> Breakpoint 1, main (argc=1, argv=0x7fffffffdff8) at small.c:5
> 5      char c[] = "abc";
> (gdb) info args argc
> argc = 1
> (gdb) step
> 6      sprintf(buf, (char *)c, 1);
> (gdb) info args argc
> argc = -8454
> (gdb)
> ...
> 
> /**************************************
> We can find that at line 5, the value of argc is 1.
> When stepping to line 6 with step, the value of argc is changed to -8454.
> However, When stepping with stepi, the value of argc is still 1 at line 6.
> 
> I am posting it here as I am not sure whether this is a gcc bug or a gdb bug.
> By the way, I found it very difficult to determine whether a problem is caused by gdb or gcc?
> Is there any suggestions?
> ***************************************/
> 
> $ gcc --version
> gcc (GCC) 10.0.1 20200419 (experimental)
> Copyright (C) 2020 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions.  There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> 
> $ gdb --version
> GNU gdb (GDB) 10.0.50.20200517-git
> Copyright (C) 2020 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.

Hi,

The only way to know is to inspect the DWARF information manually and see if it accurately
describe the program.  If not, it's a gcc bug.  It if does, it's a gdb bug.

To inspect the DWARF information, you can use `readelf --debug-dump` or `llvm-dwarfdump`
(although I am a big fan of GNU tools, I find the output of llvm-dwarfdump a bit more
readable).

In this particular case, you'd find the DIE (Debug Info Entry) for `argc` and see how the
location of that variable is described.  See the DWARF spec to understand how to interpret
the value.

Simon


More information about the Gdb mailing list