最近遇到個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時,說明系統不...