2012-04-23 187 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)