Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gdb prints wrong values when modifying arguments

Tags:

c

gdb

System

Fresh install of codeblocks 12.11 + mingw pack.

  • win7 64
  • gcc 4.7.1
  • gdb 7.5

Example code

Compiled with -g and no optimization.

#include <stdio.h>

void foo(int a, int b);

int main() {

    foo(400, 42);

    return 0;
}

void foo(int a, int b) {

    a = a - 10;
    b = a + 1;

    printf("y2 %d\n", b);

}

Problem

I put a breakpoint on "void foo(int a, int b)" and I look value of b as I step through the 3 lines. Either with the codeblocks debugging features or with the gdb command line, the value of b is 42 instead of being 391. The console output is correct, 391.

GDB commands

C:\DebugTest>"C:\Program Files (x86)\CodeBlocks\MinGW\bin\gdb.exe"
GNU gdb (GDB) 7.5
Copyright (C) 2012 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.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
For bug reporting instructions, please see:  
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file bin/Debug/DebugTest.exe
Reading symbols from C:\DebugTest\bin\Debug\DebugTest.exe...done.
(gdb) break foo
Breakpoint 1 at 0x401363: file C:\DebugTest\main.c, line 14.
(gdb) run
Starting program: C:\DebugTest\bin\Debug\DebugTest.exe
[New Thread 3596.0x658]

Breakpoint 1, foo (a=400, b=42) at C:\DebugTest\main.c:14
14          a = a - 10;
(gdb) print b
$1 = 42
(gdb) step
15          b = a + 1;
(gdb) print b
$2 = 42
(gdb) step
17          printf("y2 %d\n", b);
(gdb) print b
$3 = 42
(gdb)

Remarks

  • When the same operations are done without a function, with a and b as local variables inside main, the debug output is correct.
  • When compiled with gcc 4.4.1, the debug output is correct.

Any idea what could be wrong ? =)

like image 248
Teybeo Avatar asked Feb 06 '13 16:02

Teybeo


People also ask

How do I change values in GDB?

Use the set variable (gdb) and the assign (dbx) commands to change the value associated with a variable, memory address, or expression that is accessible according to the scope and visibility rules of the language. The expression can be any expression that is valid in the current context.

What is Ptype in GDB?

Description. This command prints a detailed description of a type, or the type of the last value in the command history. This command is similar to whatis , but whatis prints just the name of the type.

What does breakpoint do in GDB?

A breakpoint makes your program stop whenever a certain point in the program is reached. For each breakpoint, you can add conditions to control in finer detail whether your program stops.

Does GDB slow down program?

Depending on your system, watchpoints may be implemented in software or hardware. GDB does software watchpointing by single-stepping your program and testing the variable's value each time, which is hundreds of times slower than normal execution.


1 Answers

I searched on gcc bugzilla and found this bug report :

  • Bug 54218 - Debug info for function parameters is incorrect when compiled with -O0"

Althoug the report is about gcc 4.8 and I'm using 4.7, I tried the proposed workaround and it works !

Compiling with -fvar-tracking allows GDB to print the correct value for b after assignment.

like image 63
Teybeo Avatar answered Nov 08 '22 07:11

Teybeo