我怎样才能使用;手表;GDB?

我怎样才能使用;手表;GDB?,gdb,watch,Gdb,Watch,我试图通过命令“watcha”来观察“inta”的变化。但是,当程序更改为12时,它不会停止。为什么? /* FILE: test.c */ #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv){ printf("Hello world\n"); int a = 12; a = 10;

我试图通过命令“watcha”来观察“inta”的变化。但是,当程序更改为12时,它不会停止。为什么?

 /* FILE: test.c */
 #include <stdio.h>
 #include <stdlib.h>

 int main(int argc, char** argv){
  printf("Hello world\n");

  int a = 12;
  a = 10;                                                                                                                                                                      
  return 0; 
 }
/*文件:test.c*/
#包括
#包括
int main(int argc,字符**argv){
printf(“Hello world\n”);
INTA=12;
a=10;
返回0;
}

编译器甚至可能不会生成将12分配给“a”的代码,最好反汇编生成的代码以进行确认。您可能需要一个稍微复杂一点的测试来尝试这一点。

它可能有助于指定您的平台、GDB版本以及您使用的GDB命令的确切顺序

以下是我看到的(GDB似乎工作得很好):

$gcc-g test.c
$gdb a.out
GNU gdb(gdb)6.8.50.20090430-cvs
版权所有(C)2009免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-unknown-linux-gnu”。
有关错误报告说明,请参阅:
...
(gdb)清单
1#包括
2#包括
3.
4内部主(内部argc,字符**argv){
5 printf(“Hello world\n”);
6.
7 INTA=12;
8a=10;
9返回0;
10      }
11
(gdb)b 5
断点1位于0x4004a7:文件test.c,第5行。
(gdb)r
测试中的主断点1(argc=1,argv=0x7fffffffdb28)。c:5
5 printf(“Hello world\n”);
(gdb)观看a
硬件观察点2:a
(gdb)c
你好,世界
硬件观察点2:a
旧值=0
新值=12
测试时的main(argc=1,argv=0x7fffffffdb28)。c:8
8a=10;
(gdb)c
硬件观察点2:a
旧值=12
新值=10
测试时的main(argc=1,argv=0x7fffffffdb28)。c:9
9返回0;
(gdb)c
监视点2已删除,因为程序已将块留在
它的表达式是有效的。
/lib/libc.so.6的出口()中的0x00007ffff7ab3033
(gdb)c
程序正常退出。
(gdb)q

当您想要调试一个程序时,您应该始终使用-O0-g3构建(我认为您使用的是gcc,如果您不是,您的编译器可能会支持其他标志来关闭优化并启用调试信息)

在我的系统(运行Gentoo GNU/Linux的x86_64)上,当我使用任何大于或等于-O的优化时,我无法获得“int a=12”行,因为编译器将应用该行。(取自,它是-O部分中的-fdce标志)


调试时请始终记住这一点!通过使用objdump-D反汇编代码来验证代码,或者告诉编译器显示生成的程序集(在带有-S标志的gcc上)

是否使用调试信息(-g)进行编译,并且是否确实使用调试版本?
$ gcc -g test.c

$ gdb a.out
GNU gdb (GDB) 6.8.50.20090430-cvs
Copyright (C) 2009 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 "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
(gdb) list
1       #include <stdio.h>
2       #include <stdlib.h>
3
4       int main(int argc, char** argv){
5         printf("Hello world\n");
6
7         int a = 12;
8         a = 10;                                                                                                                                                                      
9         return 0; 
10      }
11
(gdb) b 5
Breakpoint 1 at 0x4004a7: file test.c, line 5.
(gdb) r

Breakpoint 1, main (argc=1, argv=0x7fffffffdb28) at test.c:5
5         printf("Hello world\n");
(gdb) watch a
Hardware watchpoint 2: a
(gdb) c
Hello world
Hardware watchpoint 2: a

Old value = 0
New value = 12
main (argc=1, argv=0x7fffffffdb28) at test.c:8
8         a = 10;                                                                                                                                                                      
(gdb) c
Hardware watchpoint 2: a

Old value = 12
New value = 10
main (argc=1, argv=0x7fffffffdb28) at test.c:9
9         return 0; 
(gdb) c

Watchpoint 2 deleted because the program has left the block in
which its expression is valid.
0x00007ffff7ab3033 in exit () from /lib/libc.so.6
(gdb) c

Program exited normally.
(gdb) q