使用gdb來進行stl容器的除錯
現代c++中stl使用的越來越普遍,較之其它型別,stl容器類的除錯顯得複雜度更好。本篇以map為例說明如何利用gdb來遍歷map中的各成員變數。
原始碼如下
#include #include#include
using
namespace
std;
int main(int arg, char**argv)
return0;
}
編譯執行
g++ -o demo -g stl_test.cpp
執行
gdb ./demobr 14
r
顯示mapexample容器中的各個元素
p mapexample$1 = std::map with 3 elements =
如果想要知道每個element的所在的記憶體區域,需要先得到stl map的型別。
ptype mapexample
顯示如下,成員函式部分略去
type = class std::map, std::less, std::allocatorint const, std::basic_string, std::allocator> > > > [with _key = int,_tp = std::basic_string, std::allocator>, _compare = std::less,_alloc = std::allocatorint const, std::basic_string, std::allocator> > >] , },
members of std::_rb_tree
const, std::basic_string, std::allocator > >, std::_select1stint
const, std::basic_string, std::allocator > > >, std::less, std::allocatorint
const, std::basic_string, std::allocator > > > >::_rb_tree_implint>, false>:
_m_key_compare =, },
_m_header =,
_m_node_count = 3
}}
至此,事情變的簡單了,利用_m_left和_m_right就可以遍歷各個二叉樹結點了。
手工方式作一次不會覺著很累,但次次都手工檢視會覺著不厭其煩。幸運的是,早有人已經提供了自動化的指令碼。具體鏈結如下
使用方法是將上述鏈結中的內容儲存到~/.gdbinit中,如果沒有.gdbinit就手工建立乙個,該檔案在gdb每次啟動時會被最先讀入。
有了上述指令碼,就可以用plist, pmap, pvector來遍歷stl容器了。
每天學點GDB(二)
預設情況下,日誌是沒有開啟的,所有的除錯資訊都會在螢幕中顯示,即預設是輸出到stdout中的。那麼有沒有可能將輸出到螢幕中的內容儲存到檔案裡呢。答案自然是肯定的,這裡面有個地方遇要注意一下子,具體會在下面的示例中提及。將日誌檔案開啟,不指定檔名的話,預設的檔名是gdb.txt。gdb set log...
每天學點GDB 2
在一中提到gdb最最基本的用法,在本節主要講述一下如何讓gdb在斷點處列印一下診斷資訊,但程式執行本身不會中斷。先稍微改一改源程式 include include int main int argc,char argv return 0 假設要在執行期間檢視i值的變化。如果是step by step...
每天學點GDB 3
預設情況下,日誌是沒有開啟的,所有的除錯資訊都會在螢幕中顯示,即預設是輸出到stdout中的。那麼有沒有可能將輸出到螢幕中的內容儲存到檔案裡呢。答案自然是肯定的,這裡面有個地方遇要注意一下子,具體會在下面的示例中提及。將日誌檔案開啟,不指定檔名的話,預設的檔名是gdb.txt gdb set log...