簡體   English   中英

獲取gdb的python接口中的所有全局變量/局部變量

[英]Get all global variables/local variables in gdb's python interface

我通過閱讀打印所有全局變量/局部變量一文了解到,我們可以在 gdb 的命令行中獲取當前幀的所有變量。

我的問題是如何在 gdb 的 python 接口中獲取當前幀的所有變量,因為info locals只是以字符串形式給出結果,這不方便進一步使用。

問題變了嗎? 我不確定,但我懷疑是因為我之前的答案非常錯誤。 我依稀記得這個問題曾經是關於全局變量的,在這種情況下,這是真的:

我不認為有辦法。 GDB 符號表僅部分暴露於 Python,我認為缺乏迭代它們的能力是漏洞之一。

但是,從 Python 迭代局部變量很容易。 您可以使用gdb.selected_frame()來獲取選定的框架。 然后,您可以從框架中使用block()方法獲取Block對象。

Block對象代表一個范圍。 您可以直接遍歷Block以從該范圍中獲取變量。 然后,使用Block.superblock上升一個范圍。 當您命中具有function屬性的塊時,您已經命中了函數的最外層作用域。

這顯示了如何根據 Tom 的建議列出所有當前可見的變量(一次)。

它只顯示當前文件中定義的全局變量,因為正如 Tom 所提到的,目前無法訪問其他文件中定義的全局變量。

我們將我們看到的名字存儲在一個集合中,並在塊樹上上升。

請注意, info locals在父框架上顯示陰影變量。 要顯示這些,只需刪除set檢查。

主文件

gdb.execute('file a.out', to_string=True)
gdb.execute('break 10', to_string=True)
gdb.execute('run', to_string=True)
frame = gdb.selected_frame()
block = frame.block()
names = set()
while block:
    if(block.is_global):
        print()
        print('global vars')
    for symbol in block:
        if (symbol.is_argument or symbol.is_variable):
            name = symbol.name
            if not name in names:
                print('{} = {}'.format(name, symbol.value(frame)))
                names.add(name)
    block = block.superblock

主文件

int i = 0;
int j = 0;
int k = 0;

int main(int argc, char **argv) {
    int i = 1;
    int j = 1;
    {
        int i = 2;
        i = 2; /* Line 10. Add this dummy line so above statement takes effect. */
    }
    return 0;
}

用法:

gcc -ggdb3 -O0 -std=c99 main.c
gdb --batch -q -x main.py

輸出:

i = 2
argc = 1
argv = 0x7fffffffd718
j = 1

global vars
k = 0

如果您還需要enum字段之類的常量,也可以使用symbol.is_constant

在 Ubuntu 14.04、GDB 7.7.1、GCC 4.8.4 上測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM