本貼适用于:Linux-ubuntu16.04版本和mac-osx 10.12+版本
一、最新代碼編譯建構
1、從github上克隆代碼倉庫到本地
[plain] view plain copy
- git clone https://github.com/EOS-Mainnet/eos
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX4FleNRDOsJWM0JjYo5kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM1EzMyczM5ETMxYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2、更新代碼倉庫子子產品,使用遞歸參數
[plain] view plain copy
- git submodule update --init --recursive
3、git tag指令檢視版本标簽,下拉找到mainnet-1.0.4,以後再更新新的版本,在代碼本地倉庫目錄下git pull,再git tag,就能找到最新版本。
4、git checkout 指令檢出mainnet-1.0.4版本代碼
git checkout mainnet-1.0.4
注意:我的系統裡因為原來已經有本地代碼倉庫,版本是mainnet-1.0.3,而且代碼有修改,是以當我git checkout的時候提示先送出修改過的代碼或把修改過的檔案stash,然後再git chekcout。因為我送出不了代碼,是以隻能選擇:get stash,然後再git checkout。這樣就可以成功檢出最新版本代碼:mainnet-1.0.4。可以使用git branch指令檢查一下檢查代碼是否成功。
正當我寫這篇貼的時候,BM團隊為解決mainnet-1.0.4版本有節點停止出塊的問題,緊急更新到了mainnet-1.0.5版本,收到消息,我git pull,拉取最新倉庫,git tag,果然mainnet-1.0.5已經存在了,是以我又進行了git checkout mainnet-1.0.5的操作,接下來就在1.0.5的版本上搞事情吧,永遠保持最新!
5、執行自動化建構腳本。
./eosio_build.sh
如果是首次編譯建構代碼,過程中可能會遇到一些坑:
比如:boost庫下載下傳失敗或安裝失敗,mongodb以及mongodb驅動下載下傳失敗,可以從我的百度網盤下載下傳:
mongo-c-driver-1.9.3
連結:https://pan.baidu.com/s/1bMMIhqGPHSIEZjIQqFVuhg 密碼:h4a1
mongodb 3.6.3
連結:https://pan.baidu.com/s/1KfPMv8qWRU8EMMLl-reAAg 密碼:38q0
請閱讀腳本:eos/scripts/eosio_build_ubuntu.sh 或 eosio_build_darwin.sh,視你的作業系統而定,把下載下傳的檔案放到合适的位置,把如下圖所示的下載下傳過程注釋掉,再進行編譯。
還有如果你安裝的是ubuntu的虛拟機,自動化編譯過程可能會因為主機實體記憶體小于7G,而報錯編譯失敗,這個問題可以通過修改eos/scripts/eosio_build_ubuntu.sh腳本中的第27-31行,注釋掉這5行,如下圖:
初次建構由于要下載下傳安裝一堆的依賴庫,時間會很長,大概2-3個小時,耐心等待吧!
如果以前已經多次編譯成功,依賴庫就不會被重新下載下傳安裝,應該會很順利。
6、為了後續操作友善,可以安裝一下,省的每次啟動nodeos或敲cleos指令行都要切換目錄
[plain] view plain copy
- sudo make install
7、config.ini檔案内容如下,可以參考。
genesis-json = ./genesis.json
block-log-dir = blocks
readonly = 0
send-whole-blocks = true
enable-stale-production = true
http-server-address = 127.0.0.1:8888
p2p-listen-endpoint = 0.0.0.0:9876
p2p-server-address = localhost:9876
allowed-connection = any
#p2p-peer-address = 192.168.31.220:9876
#p2p-peer-address = localhost:9877
required-participation = 33
#Private key: 5JZ5Wwb8uQbi3A7DmMsD2zevcKCYw1pxmitij1x4xCjU8gv7ucj
#Public key: EOS6a5pr4DS4CksCQSHqTdKMPbAdCyrE4b7QExDwTuCxH1vbkYMqG
# key for eosio
producer-name = eosio
private-key = ["EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"]
# actinve key for bp.a
producer-name = p1
private-key = ["EOS6a5pr4DS4CksCQSHqTdKMPbAdCyrE4b7QExDwTuCxH1vbkYMqG","5JZ5Wwb8uQbi3A7DmMsD2zevcKCYw1pxmitij1x4xCjU8gv7ucj"]
# actinve key for bp.b
producer-name = p2
private-key = ["EOS5NiFNF4bG7T49S6f7qVXMAt4RN2WM211s77UZrwD4cz2Xu6gw9","5JKkei9CFtawsvnHt728DUQaahcjHm5nqJsNgZzna9XZKq8eA5c"]
# actinve key for bp.c
producer-name = p3
private-key = ["EOS59rjXxZLjRnUEdErjtCEN8fihQnMmdsWYSz7jaeruPEoSeyCHz","5JBDtjPbUeV2Hte6ZuFE5ny9RtuUujWEKG1u2yYPw2jmkCR7A4Y"]
# actinve key for bp.d
producer-name = p4
private-key = ["EOS5psRxWMGyQS4HPNY8fa4PDhgP53vD4AZ6w24Z9HUCTxXKEH7Ey","5JQPYAtWxdzGsJkBpHyWBV18N2rzFtMjcBwxvfndS3KXe4oQu3L"]
plugin = eosio::producer_plugin
plugin = eosio::chain_api_plugin
#plugin = eosio::account_history_api_plugin
plugin = eosio::wallet_plugin
plugin = eosio::wallet_api_plugin
plugin = eosio::http_plugin
plugin = eosio::net_plugin
plugin = eosio::net_api_plugin
8、genesis.json檔案内容,可參考。
{
"initial_timestamp": "2018-06-08T08:08:08.888",
"initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 200000,
"target_block_cpu_usage_pct": 1000,
"max_transaction_cpu_usage": 150000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
}
}
9、config.ini和genesis.json檔案放置路徑
[plain] view plain copy
- linux-ubuntu: ~/.local/share/eosio/nodeos/config/
- mac-osx: ~/Library/Application\ Support/eosio/nodeos/data/confi
10、啟動nodeos前注意:清理舊的資料
二、使用vscode 開發工具對代碼進行單步調試,檢視堆棧調用
1、在mac-osx系統和ubuntu中都可以使用vscode對c++代碼進行開發編輯和調試,vscode工具下載下傳安裝略過,請百度。
2、這裡隻說單步調試和檢視堆棧調用,是以需要打開eosio_build.sh腳本,把第51行CMAKE_BUILD_TYPE=Release修改成CMAKE_BUILD_TYPE=Debug,執行./eosio_build.sh
./eosio_build.sh
3、編譯完成後,打開vscode,打開檔案夾,選擇eos代碼主目錄,選擇打開
4、配置任務,如圖所示菜單路徑:任務->配置任務
5、使用模闆建立tasks.json檔案
6、MSBuild執行生成目标
7、mscode會在eos工程目錄下建立一個tasks.json檔案,并打開,如下所示
8、按下圖修改tasks.json檔案
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [{
"label": "eosio_build",
"type": "shell",
"command": "cd build && make nodeos -j4",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}]
}
9、菜單:調試->添加配置...
10、vscode會在eos工程目錄下建立launch.json檔案,如下圖
11、按照下圖修改launch.json檔案
{
// 使用 IntelliSense 了解相關屬性。
// 懸停以檢視現有屬性的描述。
// 欲了解更多資訊,請通路: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/programs/nodeos/nodeos",
//"args": ["get","info"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/build",
"environment": [],
"externalConsole": true,
"MIMode": "lldb"
}
]
}
12、菜單:任務->運作任務
13、輸入或選擇eosio_build
14、如下圖所示,vscode會執行一次代碼編譯,以後修改代碼後,可以直接在這裡執行編譯。
15、編譯完成後可以在programs/nodeos/main.cpp的main函數裡下個斷點,如下圖所示
16、菜單:調試->啟動調試或F5,片刻後系統會啟動一個新的終端控制台,顯示nodes的運作,因為我們設定了斷點,是以程式會停在斷點處,終端顯示的nodeos程式也會暫停在下面的狀态。
17、nodeos程式停在斷點處,如下圖所示
18、按F5繼續運作到下個斷點,因為下個斷點還沒設定,是以nodeos程式開始不間斷執行,如下圖所示
18、按照下圖所示打開plugins->chain_plugin->chain_plugin.cpp,在get_info函數中(598)行下個斷點
19、打開一個新的終端控制台程式,輸入cleos get info指令,如下圖所示
20、控制台輸入:cleos get info指令後回車,螢幕會自動跳到vscode代碼編輯視窗,斷點調試訓示器遊标會停在598斷點處,如下圖所示
21、打開左邊欄的debug面闆,如下圖
22、左邊欄可以看到:變量、監視、調用堆棧、斷點4個标簽分欄。變量一欄可以檢視目前調試檔案下的全局和局部變量,監視一欄可以檢視添加到螢幕裡的變量的變化情況,調用堆棧一欄可以看到,從程式開始運作到斷點處的所有命名空間、類、函數的調用關系,斷點一欄顯示所有已打的斷點,可以操作使斷點有效或無效,或删除斷點。
23、下圖顯示如何把一個變量添加到螢幕
24、調試過程
25、get info 指令調試結束
26、停止調試