>加入極市..." />
<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 780字,需瀏覽 2分鐘

           ·

          2020-09-22 20:57

          ↑ 點擊藍字?關(guān)注極市平臺

          作者丨薛定諤的喵@知乎
          來源丨h(huán)ttps://zhuanlan.zhihu.com/p/152274203
          編輯丨極市平臺

          極市導(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 #include using namespace  std;
          int main() { std::map lm; lm["good"] = "heart"; // 查看map 里面內(nèi)容 std::cout<}

          當代碼運行到std<

          $2 = {_M_t = {    _M_impl = {, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > >> = {<__gnu_cxx::new_allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > >> = {}, }, , std::allocator > > >> = {        _M_key_compare = {, std::allocator >, std::__cxx11::basic_string, std::allocator >, bool>> = {}, }},  = {_M_header = {          _M_color = std::_S_red, _M_parent = 0x55555556eeb0,           _M_left = 0x55555556eeb0, _M_right = 0x55555556eeb0},         _M_node_count = 1}, }}}

          但是當你在gdb9.2里面輸入print lm的時候,你看到的將是

          (gdb) p lm$3 = std::map with 1 element = {["good"] = "heart"}

          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里面輸入(將路徑改成你下載的路徑):

          pythonimport syssys.path.insert(0, '/home/maude/gdb_printers/python')from libstdcxx.v6.printers import register_libstdcxx_printersregister_libstdcxx_printers (None)end

          這樣你就可以放心使用了~

          詳細請看:

          https://sourceware.org/gdb/wiki/STLSupport

          https://codeyarns.com/2014/07/17/how-to-enable-pretty-printing-for-stl-in-gdb/

          將重復(fù)的工作變成一個命令

          比如在調(diào)試的時候,你知道當前棧指向一個字符串,但是你不知道具體在哪里,你想遍歷這個棧將它找出來,那么你可以借助Python自定義一個命令"stackwalk",這個命令可以直接Python代碼遍歷棧,將字符串找出來。

          ###################################################### Usage: to load this to gdb run:# (gdb) source ..../path/to/
          
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                    <th id="afajh"><progress id="afajh"></progress></th>
                    91干干 | 曰本多毛视频 | 久久人妖TS三区系列电影 | 91亚洲国产成人精品一区 | 小姐操逼视频 |