天天看點

EOS開發調試環境搭建(全部流程)

本貼适用于:Linux-ubuntu16.04版本和mac-osx 10.12+版本

一、最新代碼編譯建構

1、從github上克隆代碼倉庫到本地

[plain] view plain copy

  1. git clone https://github.com/EOS-Mainnet/eos  
EOS開發調試環境搭建(全部流程)

2、更新代碼倉庫子子產品,使用遞歸參數

[plain] view plain copy

  1. git submodule update --init --recursive  
EOS開發調試環境搭建(全部流程)

3、git tag指令檢視版本标簽,下拉找到mainnet-1.0.4,以後再更新新的版本,在代碼本地倉庫目錄下git pull,再git tag,就能找到最新版本。

EOS開發調試環境搭建(全部流程)
EOS開發調試環境搭建(全部流程)

4、git checkout 指令檢出mainnet-1.0.4版本代碼

git checkout mainnet-1.0.4
           
EOS開發調試環境搭建(全部流程)

注意:我的系統裡因為原來已經有本地代碼倉庫,版本是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的版本上搞事情吧,永遠保持最新!

EOS開發調試環境搭建(全部流程)

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,視你的作業系統而定,把下載下傳的檔案放到合适的位置,把如下圖所示的下載下傳過程注釋掉,再進行編譯。

EOS開發調試環境搭建(全部流程)

還有如果你安裝的是ubuntu的虛拟機,自動化編譯過程可能會因為主機實體記憶體小于7G,而報錯編譯失敗,這個問題可以通過修改eos/scripts/eosio_build_ubuntu.sh腳本中的第27-31行,注釋掉這5行,如下圖:

EOS開發調試環境搭建(全部流程)

初次建構由于要下載下傳安裝一堆的依賴庫,時間會很長,大概2-3個小時,耐心等待吧!

如果以前已經多次編譯成功,依賴庫就不會被重新下載下傳安裝,應該會很順利。

EOS開發調試環境搭建(全部流程)
EOS開發調試環境搭建(全部流程)

6、為了後續操作友善,可以安裝一下,省的每次啟動nodeos或敲cleos指令行都要切換目錄

[plain] view plain copy

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

  1. linux-ubuntu:  ~/.local/share/eosio/nodeos/config/  
  2. 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

EOS開發調試環境搭建(全部流程)
./eosio_build.sh
           

3、編譯完成後,打開vscode,打開檔案夾,選擇eos代碼主目錄,選擇打開

4、配置任務,如圖所示菜單路徑:任務->配置任務

EOS開發調試環境搭建(全部流程)

5、使用模闆建立tasks.json檔案

EOS開發調試環境搭建(全部流程)

6、MSBuild執行生成目标

EOS開發調試環境搭建(全部流程)

7、mscode會在eos工程目錄下建立一個tasks.json檔案,并打開,如下所示

EOS開發調試環境搭建(全部流程)

8、按下圖修改tasks.json檔案

EOS開發調試環境搭建(全部流程)
{
    // 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、菜單:調試->添加配置...

EOS開發調試環境搭建(全部流程)

10、vscode會在eos工程目錄下建立launch.json檔案,如下圖

EOS開發調試環境搭建(全部流程)

11、按照下圖修改launch.json檔案

EOS開發調試環境搭建(全部流程)
{
    // 使用 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、菜單:任務->運作任務

EOS開發調試環境搭建(全部流程)

13、輸入或選擇eosio_build

EOS開發調試環境搭建(全部流程)

14、如下圖所示,vscode會執行一次代碼編譯,以後修改代碼後,可以直接在這裡執行編譯。

EOS開發調試環境搭建(全部流程)

15、編譯完成後可以在programs/nodeos/main.cpp的main函數裡下個斷點,如下圖所示

EOS開發調試環境搭建(全部流程)

16、菜單:調試->啟動調試或F5,片刻後系統會啟動一個新的終端控制台,顯示nodes的運作,因為我們設定了斷點,是以程式會停在斷點處,終端顯示的nodeos程式也會暫停在下面的狀态。

EOS開發調試環境搭建(全部流程)

17、nodeos程式停在斷點處,如下圖所示

EOS開發調試環境搭建(全部流程)

18、按F5繼續運作到下個斷點,因為下個斷點還沒設定,是以nodeos程式開始不間斷執行,如下圖所示

EOS開發調試環境搭建(全部流程)

18、按照下圖所示打開plugins->chain_plugin->chain_plugin.cpp,在get_info函數中(598)行下個斷點

EOS開發調試環境搭建(全部流程)

19、打開一個新的終端控制台程式,輸入cleos get info指令,如下圖所示

EOS開發調試環境搭建(全部流程)

20、控制台輸入:cleos get info指令後回車,螢幕會自動跳到vscode代碼編輯視窗,斷點調試訓示器遊标會停在598斷點處,如下圖所示

EOS開發調試環境搭建(全部流程)

21、打開左邊欄的debug面闆,如下圖

EOS開發調試環境搭建(全部流程)

22、左邊欄可以看到:變量、監視、調用堆棧、斷點4個标簽分欄。變量一欄可以檢視目前調試檔案下的全局和局部變量,監視一欄可以檢視添加到螢幕裡的變量的變化情況,調用堆棧一欄可以看到,從程式開始運作到斷點處的所有命名空間、類、函數的調用關系,斷點一欄顯示所有已打的斷點,可以操作使斷點有效或無效,或删除斷點。

EOS開發調試環境搭建(全部流程)

23、下圖顯示如何把一個變量添加到螢幕

EOS開發調試環境搭建(全部流程)

24、調試過程

EOS開發調試環境搭建(全部流程)

25、get info 指令調試結束

EOS開發調試環境搭建(全部流程)

26、停止調試

EOS開發調試環境搭建(全部流程)

繼續閱讀