gdb獲取程序的全域性變數

2021-08-11 03:16:05 字數 1986 閱讀 6480

0、前言

在程式執行過程中,我們經常需要檢視一些變數的情況以此來判斷當前程式的運**況,對於嵌入式linux裝置而言,最常見的就是填加相應的列印資訊至控制台或是寫入到日誌檔案中,這兩種方式在本質上可以認為是類似的,只不過前者是將控制台作為輸出,而後者是以日誌檔案作為輸出。

因為增加列印檢視變數,需要重新對程式進行編譯處理,有時候這樣的操作會比較繁瑣和耗時,而我們可能又需要檢視未加入列印資訊處理的某些變數,這時候我們可以採用gdb處理來進行。

1、gdb

gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。此處不作具體介紹,大家可以參考《軟體除錯的藝術》一書以及《debug hacks 中文版 ---深入除錯的技術和工具》一書,這兩本書對gdb工具的使用有比較詳細的介紹,個人認為這兩本書算比較經典的。

2、shell中去執行子命令

shell中通常將eof與 <

當shell看到《的時候,它就會知道下乙個詞是乙個分界符。在該分界符以後的內容都被當作輸入,直到shell又看到該分界符(位於單獨的一行)。這個分界符可以是你所定義的任何字串。

3、指令碼實現

在進行指令碼編寫時,我們需要知道我們所需要檢視獲取的程式中全域性變數的名稱,注意,此處必須是全域性變數,因全域性變數存放在靜態儲存區,位置是固定的,而區域性變數在棧空間,棧位址是不固定的,並且可能隨時釋放。只有固定位址的變數我們才能通過gdb的方式去檢視其值。

編寫 of_state.sh指令碼,內容如下

#!/bin/bash

pname=of

parameter=v_ofp_shared->connect_of_ok

pid=`ps -ef | grep $ | grep -v "grep" | awk ''`

gdb -p $

p v_ofp_shared->connect_of_ok

quit

****

state=$(cat log.txt | grep -r "(gdb) \$1" | awk '')

echo ""

echo "********** the state **********"

if [ $ -eq 1 ]; then

echo openflow ok!

else

echo openflow fail!

fi具體的分析:

首先,我們依據程序名來獲取到程序的pid;

pid=`ps -ef | grep $ | grep -v "grep" | awk ''`

其次 ,執行 「gdb -p 程序pid 」,以進入gdb模式;

gdb -p $

接著,在gdb模式下,我們採用 " p 變數名" 的方式,來檢視到變數的值

p v_ofp_shared->connect_of_ok

注意此處我們是在shell指令碼下進入到gdb模式,gdb模式下的命令處理就需要用到上述第2步中所提及的shell中去執行子命令的處理

gdb -p $

..........

****

此處分界符我們使用的是「****」,使用"eof"或其他的字串作為分界符是一樣的。為了獲取到所需變數的值,我們需要將gdb的除錯資訊先存起來,就是上述中的

>log.txt 來講gdb的所有除錯資訊重定向到log.txt檔案中

最後,我們從log.txt檔案,去提取出我們所需要的變數的值資訊

log.txt檔案的內容類似於上圖所示,我們需要從中提取出「$1 = 」後的值

cat log.txt | grep -r "(gdb) \$1" | awk ''

獲取到所需全域性變數的值後,我們可以進行相應的echo列印以及或許的判定處理。

static全域性變數 全域性變數

1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...

父 子程序中的全域性變數

子程序建立以後,會繼承父程序的全域性變數,但是繼承的是父程序剛開始全域性變數的值。但是子程序建立以後,子程序修改了變數,或者父程序修改了全域性變數的值,父子程序就互相都不影響了。用訊號模擬司機售票員問題 建立子程序代表售票員,父程序代表司機 同步過程如下 1 售票員捕捉sigint 代表開車 發si...

vue快速獲取全域性變數

簡單獲取寫法 template div div template 每次都需要填寫 store.state.快速獲取寫法 script import from vuex export default computed methods created script 在計算屬性中 用 mapstare 的...