How can I use “watch” GDB?

巧了我就是萌 提交于 2020-01-28 10:38:09

问题


I tried to watch the change of the "int a" by the command "watch a". However, the program does not stop, when it changes to 12. Why?

 /* 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; 
 }

回答1:


It may help to specify your platform, version of GDB, and exact sequence of GDB commands you used.

Here is what I see (GDB appears to work just fine):

$ 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



回答2:


When you want to debug a program you should always build with -O0 -g3 (i take that you are using gcc, if you are not your compiler will probably support other flags to turn down optimization and enable debug information).

On my system (x86_64 running Gentoo GNU/Linux) i am unable to get at the 'int a = 12' line when i use any optimization greater or equal to -O as the compiler will then apply dead code elimination. (Taken from here, it is the -fdce flag in the -O section)

Always keep this in mind when you are debugging! Verify your code by either disassembling it with objdump -D or tell your compiler to show you the generated assembly (on gcc with the -S flag)




回答3:


The compiler is likely not even generating code to assign 12 to "a", it would be a good idea to disassemble the generated code to confirm. You probably need a slightly more complex test to try this out.



来源:https://stackoverflow.com/questions/835757/how-can-i-use-watch-gdb

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!