bitcoin源碼研讀(1)——用vim單步調(diào)試bitcoin

用vim單步調(diào)試bitcoin

區(qū)塊#0. 前言

參加了區(qū)塊鏈研習(xí)社的源碼研讀班,準(zhǔn)備研讀下比特幣核心(Bitcoin Core)的源碼界赔,為了更好的掌握其脈絡(luò)丢习,單步調(diào)試是必不可少的牵触,那么就先來準(zhǔn)備下環(huán)境吧~

這里通過vim+vimgdb插件,來構(gòu)造一個gdb的調(diào)試環(huán)境咐低。

區(qū)塊#1. 環(huán)境搭建

1.1 vim環(huán)境

安裝vim+vimgdb插件揽思,該插件以補丁方式提供,需要重新編譯安裝vim见擦,有些遺憾該插件很久沒有更新了钉汗,目前僅支持vim7.4版本。

1.1.1 源碼下載

  • vim7.4及對應(yīng)vimgdb插件下載
$ wget https://github.com/vim/vim/archive/v7.4.tar.gz
$ git clone https://github.com/cpiger/vimgdb-for-vim7.4.git

1.1.2 打上補丁

  • 解壓vim7.4并打上vimgdb補丁
$ tar -zxf v7.4.tar.gz
$ ln -s vim-7.4/ vim74
$ patch -p0 < vimgdb-for-vim7.4/vim74.patch 
patching file vim74/src/auto/configure
patching file vim74/src/buffer.c
patching file vim74/src/clewn/gdb.h
patching file vim74/src/clewn/gdb_lvl2.c
patching file vim74/src/clewn/gdb_lvl3.c
patching file vim74/src/clewn/misc.c
patching file vim74/src/clewn/misc.h
patching file vim74/src/clewn/obstack.c
patching file vim74/src/clewn/obstack.h
patching file vim74/src/config.h.in
patching file vim74/src/config.mk.in
patching file vim74/src/configure.in
patching file vim74/src/eval.c
patching file vim74/src/ex_cmds.c
patching file vim74/src/ex_getln.c
patching file vim74/src/feature.h
patching file vim74/src/gdb.c
patching file vim74/src/globals.h
patching file vim74/src/gui.c
patching file vim74/src/gui_gtk_x11.c
patching file vim74/src/gui_x11.c
patching file vim74/src/main.c
patching file vim74/src/Makefile
patching file vim74/src/normal.c
patching file vim74/src/option.c
patching file vim74/src/option.h
patching file vim74/src/os_unix.c
patching file vim74/src/proto/gdb.pro
patching file vim74/src/proto.h
patching file vim74/src/screen.c
patching file vim74/src/structs.h
patching file vim74/src/version.c
patching file vim74/src/window.c

若沒有任何錯誤信息鲤屡,即打補丁成功损痰。

1.1.3 編譯安裝

(1)執(zhí)行configure命令

$ cd vim74/
$ ./configure --with-features=huge --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ --enable-perlinterp --enable-cscope --enable-multibyte --enable-xim --enable-gdb --prefix=/home/rzexin/Software/ALL/vimgdb

核心參數(shù)是:--enable-gdb,根據(jù)需要開啟其他屬性

參數(shù)說明:

  • --enable-gdb:開啟gdb支持
  • --with-features=huge:支持最大特性
  • --enable-pythoninterp:啟用Vim對python編寫的插件的支持
  • --enable-multibyte和--enable-xim:需要在Vim中輸入中文酒来,開啟這兩個特性
  • --enable-cscope:Vim對cscope支持
  • --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ 指定 python 路徑
  • --prefix=/home/rzexin/Software/ALL:設(shè)定編譯安裝路徑

(2)修改Makefile文件

設(shè)置--prefix并未修改src/Makefile中的配置卢未,將以下三行注釋掉,以便vim可以安裝到我們指定的目錄

# BINDIR   = /opt/bin                        
# MANDIR   = /opt/share/man
# DATADIR  = /opt/share

(3)編譯&安裝

-j:是make命令執(zhí)行線程數(shù)堰汉,可根據(jù)機器性能調(diào)大一點尝丐,縮短編譯等待時間

CFLAGS="-O2 -D_FORTIFY_SOURCE=1":不加該參數(shù),安裝后啟動vim會core

$ make -j2 CFLAGS="-O2 -D_FORTIFY_SOURCE=1"
$ make install
$ tree -L 2 ~/Software/ALL/vimgdb/
/home/rzexin/Software/ALL/vimgdb/
├── bin
│   ├── ex -> vim
│   ├── rview -> vim
│   ├── rvim -> vim
│   ├── view -> vim
│   ├── vim
│   ├── vimdiff -> vim
│   ├── vimtutor
│   └── xxd
└── share
    ├── man
    └── vim

1.1.4 環(huán)境配置

(1)設(shè)置環(huán)境變量

之所以要安裝到/home/rzexin/Software/ALL/vimgdb目錄衡奥,還是因為vimgdb插件支持的vim版本過低,會導(dǎo)致不少基于高版本vim的插件使用不了远荠,如:vim-go(v7.4.1689+)矮固、YouCompleteMe(v7.4.1578+)等。

$ vim
vim-go requires Vim 7.4.1689 or Neovim, but you're using an older version.
Please update your Vim for the best vim-go experience.
If you really want to continue you can set this to make the error go away:
    let g:go_version_warning = 0
Note that some features may error out or behave incorrectly.
Please do not report bugs unless you're using Vim 7.4.1689 or newer.
YouCompleteMe unavailable: requires Vim 7.4.1578+.
Press ENTER or type command to continue

通過別名方式譬淳,單獨提供一個專門用于gdb調(diào)試的vim:vimg档址,vim命令還是對應(yīng)系統(tǒng)自帶vim

alias vimg='/home/rzexin/Software/ALL/vimgdb/bin/vim' 

(2)拷貝運行環(huán)境配置

$ cp -r vimgdb-for-vim7.4/vimgdb_runtime/* ~/.vim

(3)激活命令幫助

$ cd ~/.vim/doc/
$ vimg

執(zhí)行命令:helptags .,而后就能使用:help vimgdb打開vimgdb的幫助文檔了:

1.2 bitcoin環(huán)境

安裝好vim及vimgdb插件后,我們下面來獲取bitcoin-core源碼了邻梆。

1.2.1 源碼下載

下載當(dāng)前最新版本

$ wget https://github.com/bitcoin/bitcoin/archive/v0.16.2.tar.gz
$ tar -zxvf v0.16.2.tar.gz
$ tree -L 1 bitcoin-0.16.2/
bitcoin-0.16.2/
├── autogen.sh
├── build-aux
├── configure.ac
├── contrib
├── CONTRIBUTING.md
├── COPYING
├── depends
├── doc
├── INSTALL.md
├── libbitcoinconsensus.pc.in
├── Makefile.am
├── README.md
├── share
├── src
└── test

1.2.2 編譯安裝

注:需開啟debug參數(shù):--enable-debug

$ cd ~/BlockChain/Bitcoin/bitcoin-0.16.2/
$ ./autogen.sh
$ ./configure --enable-debug --prefix=/home/rzexin/Software/ALL/bitcoin
Options used to compile and link:
  with wallet   = yes
  with gui / qt = yes
    qt version  = 5
    with qr     = auto
  with zmq      = no
  with test     = yes
  with bench    = yes
  with upnp     = auto
  use asm       = yes
  debug enabled = yes
  werror        = no
  target os     = linux
  build os      = 
  CC            = gcc
  CFLAGS        = -g -O2 -g3 -O0
  CPPFLAGS      =  -DDEBUG -DDEBUG_LOCKORDER -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS
  CXX           = g++ -std=c++11
  CXXFLAGS      = -g -O2 -g3 -O0 -Wall -Wextra -Wformat -Wvla -Wformat-security -Wno-unused-parameter -Wno-implicit-fallthrough
  LDFLAGS       = 
  ARFLAGS       = cr

$ make -j2 && make install

$ tree ~/Software/ALL/bitcoin/
/home/rzexin/Software/ALL/bitcoin/
├── bin
│   ├── bench_bitcoin
│   ├── bitcoin-cli
│   ├── bitcoind
│   ├── bitcoin-qt
│   ├── bitcoin-tx
│   ├── test_bitcoin
│   └── test_bitcoin-qt
├── include
│   └── bitcoinconsensus.h
├── lib
│   ├── libbitcoinconsensus.a
│   ├── libbitcoinconsensus.la
│   ├── libbitcoinconsensus.so -> libbitcoinconsensus.so.0.0.0
│   ├── libbitcoinconsensus.so.0 -> libbitcoinconsensus.so.0.0.0
│   ├── libbitcoinconsensus.so.0.0.0
│   └── pkgconfig
│       └── libbitcoinconsensus.pc
└── share
    └── man
        └── man1
            ├── bitcoin-cli.1
            ├── bitcoind.1
            ├── bitcoin-qt.1
            └── bitcoin-tx.1
  • 可執(zhí)行文件說明
程序名 說明
bitcoind 比特幣運行的核心程序俗稱bitcoin core
bitcoin-cli Bitcoind的一個功能完備的RPC客戶端守伸,包括查詢區(qū)塊,交易信息等等
bitcoin-qt 比特幣錢包
bitcoin-tx 比特幣交易處理模塊浦妄,支持交易的查詢和創(chuàng)建
test_bitcoin 運行各個模塊的測試代碼
test_bitcoin-qt 運行錢包的模塊測試代碼

1.2.3 環(huán)境配置

(1)配置PATH和LD_IBRARY_PATH

export PATH=/home/rzexin/Software/ALL/bitcoin/bin:$PATH                         
export LD_LIBRARY_PATH=/home/rzexin/Software/ALL/bitcoin/lib:$LD_LIBRARY_PATH 

(2)配置幫助文檔

export MANPATH=/home/rzexin/Software/ALL/bitcoin/share/man:$MANPATH
# man幫助手冊彩色輸出
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'

通過上述配置尼摹,可以使用man命令查看到幫助文檔,且是彩色打印便于查看:

$ man bitcoind

1.2.4 錢包啟動

很好奇當(dāng)前(2018.08.14)比特幣賬本總的大小剂娄,故啟動看看:)

已經(jīng)有203GB蠢涝!好吧,我可憐的256GB本兒阅懦,就別指望同步下來了:(

區(qū)塊#2. 調(diào)試實踐

2.1 vim單步調(diào)試小demo

2.1.1 準(zhǔn)備demo

一個計算階乘小demo

// $ cat main.cpp 
#include <stdio.h>

extern int factor(int n, int *rt);

int main(int argc, char **argv)
{
    int i;
    int result = 1;

    for (i = 1; i < 6; i++)
    {
        factor(i, &result);
        printf("%d! = %d\n", i, result);
    }

    return 0;
}  

//$ cat factor.cpp 
int factor(int n, int *r)
{
    if (n <= 1)
    {
        *r =  n;
    } 
    else
    {
        factor(n - 1, r);
        *r *= n;
    }

    return 0;
}  

編譯&執(zhí)行:

$ g++ -g -Wall -o demo main.cpp factor.cpp
$ ./demo 
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120

2.1.2 vimrc配置

""""""""""""""""""""""""""""""""""
" => vimgdb
""""""""""""""""""""""""""""""""""
let g:vimgdb_debug_file = ""
run macros/gdb_mappings.vim
map <F2> :run macros/gdb_mappings.vim<CR>
nmap <leader>g :bel 40vsplit gdb-variables<cr> 

2.1.3 單步調(diào)試實踐

(1)使用前面自己編譯的vim打開源碼

$ vimg main.cpp

(2)按F2鍵和二,相當(dāng)于執(zhí)行::run macros/gdb_mappings.vim,加載vimgdb補丁的綁定

(3)按F7鍵,進(jìn)行gdb keys mapped耳胎,開啟gdb調(diào)試功能

(4)點擊空格惯吕,下方出現(xiàn)調(diào)試交互窗口

(5)在交互窗口中惕它,輸入file demo,綁定我們前面生成的可執(zhí)行文件

執(zhí)行后废登,將會看到如下提示信息:

(gdb) file demo
  Reading symbols from demo...done.

(6)使用CTRL+B設(shè)置斷點

(7)執(zhí)行R啟動程序淹魄,或在控制窗口中執(zhí)行run命令

可見demo停在斷點出

(8)使用CTRL+n單步執(zhí)行,使用C進(jìn)行continue

(9)使用,g打開變量窗口

(10)通過CTRL+v選中變量钳宪,通過CTRL+p添加變量到變量窗口中揭北,便于觀察執(zhí)行過程中值的變化

(11)在12行通過執(zhí)行S單步進(jìn)入factor函數(shù),同樣的方法吏颖,將*r也添加進(jìn)變量窗口

(12)單機空格進(jìn)入命令窗口搔体,執(zhí)行quit,結(jié)束gdb調(diào)試

2.1.4 更多指令

執(zhí)行:help gdb-mappings可查看

按鍵 用途
<Space> launch the interactive gdb input-line window
CTRL-Z send an interrupt to GDB and the program it is running
B info breakpoints
L info locals
A info args
S step
I stepi
CTRL-N next: next source line, skipping all function calls
X nexti
F finish
R run
Q quit
C continue
W where
CTRL-U up: go up one frame
CTRL-D down: go down one frame
CTRL-B set a breakpoint on the line where the cursor is located
CTRL-E clear all breakpoints on the line where the cursor is located
CTRL-P Normal mode: print value of word under cursor
CTRL-X print value of data referenced by word under cursor

2.2 vim單步調(diào)試bitcoind

接下來就是激動人心的比特幣核心源碼的單步調(diào)試了

2.2.1 進(jìn)入安裝目錄

我們可看到源碼和可執(zhí)行程序都在一個目錄

$ cd /home/rzexin/BlockChain/Bitcoin/bitcoin-0.16.2/src
$ ls bitcoind bitcoind.cpp 
bitcoind  bitcoind.cpp

2.2.2 單步調(diào)試實踐

(1)打開源碼文件

$ vimg bitcoind.cpp

(2)執(zhí)行F2半醉、F7開啟GDB調(diào)試功能

(3)執(zhí)行CTRL+B設(shè)置斷點

(4)這次由于要指定一些參數(shù)疚俱,就不再通過執(zhí)行R啟動程序,而是執(zhí)行空格進(jìn)入調(diào)試終端后缩多,執(zhí)行如下命令啟動

regtest:是一個本地測試環(huán)境呆奕,可以根據(jù)需要實時創(chuàng)建區(qū)塊

datadir:不指定的話,默認(rèn)創(chuàng)建在~/.bitcoin

start -server -keypool=1 -rest -discover=0 -regtest -datadir=/home/rzexin/BlockChain/Bitcoin/data

(5)使用CTRL+n單步執(zhí)行衬吆,使用CTRL+s單步進(jìn)入函數(shù)

(6)進(jìn)一步探索

區(qū)塊#3. 結(jié)語

好了梁钾,單步調(diào)試環(huán)境已經(jīng)準(zhǔn)備好了,那么接下來就開始愉快的bitcoin探索之旅吧逊抡。姆泻。。

區(qū)塊鏈研習(xí)社源碼研讀班第五期-rzexin

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冒嫡,一起剝皮案震驚了整個濱河市拇勃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孝凌,老刑警劉巖方咆,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蟀架,居然都是意外死亡瓣赂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門辜窑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钩述,“玉大人,你說我怎么就攤上這事穆碎⊙揽保” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長方面。 經(jīng)常有香客問我放钦,道長,這世上最難降的妖魔是什么恭金? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任操禀,我火速辦了婚禮,結(jié)果婚禮上横腿,老公的妹妹穿的比我還像新娘颓屑。我一直安慰自己,他們只是感情好耿焊,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布揪惦。 她就那樣靜靜地躺著,像睡著了一般罗侯。 火紅的嫁衣襯著肌膚如雪器腋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天钩杰,我揣著相機與錄音纫塌,去河邊找鬼。 笑死讲弄,一個胖子當(dāng)著我的面吹牛措左,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播避除,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼媳荒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驹饺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缴渊,失蹤者是張志新(化名)和其女友劉穎赏壹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衔沼,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蝌借,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了指蚁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩佑。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凝化,靈堂內(nèi)的尸體忽然破棺而出稍坯,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布瞧哟,位于F島的核電站混巧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勤揩。R本人自食惡果不足惜咧党,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陨亡。 院中可真熱鬧傍衡,春花似錦、人聲如沸负蠕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虐急。三九已至箱残,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間止吁,已是汗流浹背被辑。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敬惦,地道東北人盼理。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像俄删,于是被迫代替她去往敵國和親宏怔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1畴椰、文件和目錄: # cd /home 進(jìn)入 '/home' 目錄 # cd .. ...
    XDgbh閱讀 2,014評論 0 1
  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯誤原因->產(chǎn)生新的現(xiàn)象去驗證假設(shè)”這樣一個循環(huán)過程臊诊,根據(jù)現(xiàn)象如何假設(shè)錯誤原...
    Manfred_Zone閱讀 16,551評論 0 26
  • 要讓語文課堂“活”起來,必須要學(xué)生動起來斜脂。課前要布置明確的預(yù)習(xí)任務(wù)抓艳,這是學(xué)生充分參與課堂的基礎(chǔ)。課堂上帚戳,學(xué)生參與到...
    陜縣2283陰秀麗閱讀 167評論 0 1
  • 依稀過客 有些人不可抗拒的出現(xiàn)在我們的生命中玷或,然后又不可抗拒的走了,我把他們稱之為過客片任。 你很搞笑啊 信息被她看到...
    南焱閱讀 383評論 0 0
  • 每一個生命贈予的寶貝偏友,都在暗中標(biāo)明了保質(zhì)期,而我希望是你最珍貴也最久用的唯一…… 01 蔚小楓正啃著最愛的巨型雞腿...
    若水憶風(fēng)閱讀 524評論 10 4