gdb除錯擴充套件指令碼開發

2021-06-07 19:59:16 字數 1343 閱讀 7786

最近遇到個bug,資料回檔一天,查詢發現是資料沒有存檔成功造成的,還好用gcore留了屍體,至於為什麼存檔不成功我這裡不**了,主要是從core檔案要恢復這一天的資料,裡面有些存檔還是挺重要的,除錯進去發現需要把乙個list中的資料恢復到資料庫中,這樣我需要根據記憶體資料寫乙份sql指令碼來恢復,首先這個list不是stl的list,網上可以搜尋gdb擴充套件開發相關

>>vi gdb.conf

指令碼內容如下

define p_list//定義

set logging file /data/log.log  #除錯資訊重定向到/data/log.log 檔案中

set logging on#開啟重定向功能

if $argc==1#argc是引數個數

set $list = $arg0 #arg0就是第乙個引數了,arg1為第二個,依次類推

set $head=$list.head

set $current=($list.head.next)

set $size=$list.nsize

set $i=0

while $i<$size

printf "elem[%u]:",$i#printf與c的printf用法類似

p (($current).data).id

set $name=(($current).data).name

printf "名字:%s",$name#這裡不能直接這樣列印printf "%s"(($current).data).name,報錯說記憶體非法,不知道為啥,用個臨時變數就可以了

set $current=($current)->next

set $i++

endelse

printf "error[%u]\n",$argc

endset logging off#關閉重定向功能

end儲存成功到 /data/gdb.conf

在gdb除錯中

gdb>>source /data/gdb.conf

gdb>> p_list val   //這裡val就是第乙個引數,是個list

這樣可以列印所有的list中的data資訊,你發現上面的可以直接取data資訊的成員變數,gdb會自動識別型別資訊

當然我實際的指令碼是直接運用printf和重定向除錯資訊到檔案中從而實現了自動生成sql指令碼

其實windows下也有這樣的功能,具體見~\microsoft visual studio x.0\common7\packages\debugger\autoexp.dat,裡面的stl都處理了,所以你會發現windows除錯時stl列印是那麼的直觀,不過有個缺陷就是微軟雖然提供了這個東西,但是沒有一丁點的文件來介紹它,所以需要自己多google相關

gdb除錯PHP擴充套件錯誤

有時候,使用php的第三方擴充套件之後,可能會發生一些錯誤,這個時候,可能就需要更底層的方式追蹤除錯程式發生錯誤的地方和原因,熟悉linux下c程式設計的肯定不陌生gdb 首先,使用ulimit c命令,檢視系統是否會生成 core檔案。返回結果可能是0 ulimit c當返回結果為0時,說明系統不...

gdb除錯PHP擴充套件錯誤

有時候,使用php的第三方擴充套件之後,可能會發生一些錯誤,這個時候,可能就需要更底層的方式追蹤除錯程式發生錯誤的地方和原因,熟悉linux下c程式設計的肯定不陌生gdb 首先,使用ulimit c命令,檢視系統是否會生成 core檔案 sh 返回結果可能是0 ulimit c當返回結果為0時,說明...

gdb除錯PHP擴充套件錯誤

有時候,使用php的第三方擴充套件之後,可能會發生一些錯誤,這個時候,可能就需要更底層的方式追蹤除錯程式發生錯誤的地方和原因,熟悉linux下c程式設計的肯定不陌生gdb 首先,使用ulimit c命令,檢視系統是否會生成 core檔案。返回結果可能是0 ulimit c當返回結果為0時,說明系統不...