EOS开发调试环境搭建(全部流程)

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

一、最新代码编译构建
1、从github上克隆代码仓库到本地
[plain]  view plain  copy
  1. git clone https://github.com/EOS-Mainnet/eos  


2、更新代码仓库子模块,使用递归参数

[plain]  view plain  copy
  1. 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
  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.   
  3. 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、停止调试



猜你喜欢

转载自blog.csdn.net/caokun_8341/article/details/80713851