Sistema
Instalación nueva de Codeblocks 12.11 + paquete mingw.
- ganar7 64
- CCG 4.7.1
- gdb 7.5
Código de ejemplo
Compilado con -g y sin optimización.
#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);
}
Problema
Pongo un punto de interrupción en “void foo(int a, int b)” y busco el valor de b mientras paso por las 3 líneas. Ya sea con las funciones de depuración de Codeblocks o con la línea de comando gdb, el valor de b es 42 en lugar de ser 391. La salida de la consola es correcta, 391.
Comandos GDB
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)
Observaciones
- Cuando el mismas operaciones están hechos sin una función, con a y b como variables locales dentro de main, la salida de depuración es correcto.
- Cuando se compila con gcc 4.4.1, la salida de depuración es correcto.
¿Alguna idea de lo que podría estar mal? =)
Estoy usando Code Blocks 10.05 (GNU gdb 6.8), muestra b como 391.
– SS Hegde
6 de febrero de 2013 a las 16:46
¿Estás imprimiendo el valor de
b
en gdb después de la asignaciónb = a + 1;
?– ks1322
6 de febrero de 2013 a las 16:49
a qué te refieres con
step inside foo
?break foo
,run
luegoprint b
?– David Berra
6 de febrero de 2013 a las 16:53
Sí, imprimo b tanto antes como después
b = a + 1
línea. @DavideBerra puse un punto de interrupción en elvoid foo(int a, int b) {
usando bloques de código, no uso el comando gdb excepto imprimir. Actualicé la publicación.– Teybéo
06/02/2013 a las 19:40
Un conjunto completo de comandos gdb que muestren el problema podría confirmar o refutar algunas de esas sospechas de que podría ser solo un mal uso o un malentendido…
– Aschepler
6 de febrero de 2013 a las 19:47