2012-04-23 195 views
17

我知道gdb允许已经声明的变量是set使用set命令。如何用GDB在给定的函数范围内声明一个变量?

gdb是否可以在给定函数的范围内动态声明新变量?

+10

它会做什么好?代码不会意识到它的存在。 – 2012-04-23 16:06:48

+0

无论如何,请同意@JamesMcLaughlin清楚:**否**,仅限于检查。 – 2012-04-23 16:09:46

+6

你确定你不想要一个gdb变量吗?为了方便起见,你可以在gdb的上下文中创建变量,比如'set $ foo = ...'和后面的参考'$ foo'。然而,显然这些变量对于运行的代码是不可见的。 – FatalError 2012-04-23 16:14:02

回答

14

对于C(也可能是C++)代码,这将是非常困难的,因为在大多数实现中这样做会涉及到移动堆栈指针,这将导致函数的退出代码失败,因为它不再匹配大小堆栈框架。同样,访问局部变量的函数中的所有代码都会突然冒着碰到错误的位置的风险,这也是不好的。我不这么认为,不。

6

这就是我用来打印变量

(gdb) set $path=((ngx_path_t  **)ngx_cycle->paths.elts)[2] 
(gdb) print *$path 
    $16 = { 
     name = { 
      len = 29, 
      data = 0x80ed15c "/usr/local/nginx/fastcgi_temp" 
      }, 
     len = 5, 
     level = {1, 2, 0}, 
     manager = 0, 
     loader = 0, 
     data = 0x0, 
     conf_file = 0x0, 
     line = 0 
    } 
12

您可以动态地分配一些空间,并用它来存储一个新的变量。取决于“当前函数的作用域”的含义,它可能不是你想要的。

但在这里是如何的样子,当你有函数func(),它的指针输出参数:

set $foo = alloc(sizeof(struct funcOutStruct)) 
func($foo) 
p *$foo 
free($foo)