每天學點GDB 8

2021-09-06 09:27:11 字數 1472 閱讀 8309

使用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 ./demo

br 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...