本贴适用于:Linux-ubuntu16.04版本和mac-osx 10.12+版本
一、最新代码编译构建
1、从github上克隆代码仓库到本地
[plain] view plain copy
2、更新代码仓库子模块,使用递归参数
[plain] view plain copy
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
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
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、停止调试