你還在用GDB調(diào)試程序嗎?

極市導(dǎo)讀
?借助Python scripting功能,使用者能夠提高自己的GDB調(diào)試技能,輕松解決繁復(fù)的工作。>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿
你還在用GDB調(diào)試程序嗎?
如果是,那么我們是同道中人。但是你知道GDB有一個很強大的功能,Python scripting嘛?
如果是的,那么恭喜你,你是一個大牛。
本文主要講述如何使用Python來提高你的GDB調(diào)試技能, 讓你從繁重的重復(fù)的工作里面掙脫出來呼吸新鮮空氣。
首先,第一件事,使用gdb7.x以上的版本,最好9.x的。因為Python的支持是從gdb7.0(2009年?)開始的。
進入正題
gdb本來就支持自定義腳本輔助調(diào)試,為什么還要用Python腳本呢?因為自定義腳本的語法比較老,不如寫Python歡快。如果你喜歡用原來的自定義腳本方法,那也是可以的。
借助Python,你可以將難看的數(shù)據(jù)變得好看,
借助Python,你可以將重復(fù)的工作變成一個命令,
借助Python,你可以更快的調(diào)試bug,
借助Python,你可以裝逼,哈哈哈……
將難看的數(shù)據(jù)變得好看
以下面的代碼為例:
#include#include#includeusing namespace std;int main() {std::maplm; lm["good"] = "heart";// 查看map 里面內(nèi)容std::cout<}
當代碼運行到std< 但是當你在gdb9.2里面輸入print lm的時候,你看到的將是 map里面有什么一清二楚。這是因為gdb9.x自帶了一系列標準庫的Python pretty priniter。如果你使用的是gdb7.x,那么你可以手動的導(dǎo)入這些pretty printer實現(xiàn)同樣的效果。具體步驟如下: 下載pretty printer: svn co svn://http://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python 在gdb里面輸入(將路徑改成你下載的路徑): 這樣你就可以放心使用了~ 詳細請看: https://sourceware.org/gdb/wiki/STLSupport https://codeyarns.com/2014/07/17/how-to-enable-pretty-printing-for-stl-in-gdb/ 比如在調(diào)試的時候,你知道當前棧指向一個字符串,但是你不知道具體在哪里,你想遍歷這個棧將它找出來,那么你可以借助Python自定義一個命令"stackwalk",這個命令可以直接Python代碼遍歷棧,將字符串找出來。$2 = {_M_t = { _M_impl = { _M_key_compare = { _M_color = std::_S_red, _M_parent = 0x55555556eeb0, _M_left = 0x55555556eeb0, _M_right = 0x55555556eeb0}, _M_node_count = 1}, (gdb) p lm$3 = std::map with 1 element = {["good"] = "heart"}pythonimport syssys.path.insert(0, '/home/maude/gdb_printers/python')from libstdcxx.v6.printers import register_libstdcxx_printersregister_libstdcxx_printers (None)end將重復(fù)的工作變成一個命令
###################################################### Usage: to load this to gdb run:# (gdb) source ..../path/to/
