EOS的理解离不开源码的阅读,而单步调试能在阅读源码出现困惑时为你解开迷雾。
每个人在不同系统下都有自己的喜欢的工具来阅读源码,如在Windows下使用SourceInsight,跨平台的开源工具Eclipse,还有收费的CLion等等,此处介绍并测试使用的是vscode(Visual Studio Code),是微软的一款开源的跨平台编辑器,配置调试EOS源码非常方便。如果你还没有趁手的工具,可以试试上述的几个。
1.测试环境:
Ubuntu 16.04 LTS
macOS High Sierra(10.13.3)
2.源码及编译参考全面理解EOS——1.源码编译及运行 需要注意的是,在执行eosio_build.sh时,加上 -o Debug 参数。
3.下载vscode
https://code.visualstudio.com/
1.安装cpptools扩展
安装完vscode后,还有安装cpptools扩展,如下图所示:
2.打开eosio源码文件
在首次启动vscode后的欢迎页面,点击选择“打开文件夹”,选择eos的源码目录即可
3.配置调试信息
点击左侧“调试”,选择“添加配置”,会打开launch.json文件,按图中配置即可:
此处是希望调试nodeos程序,因此配置program路径是你的nodeos编译生成的目录,另外启动参数args的配置,这里是参考官方文档上启动单节点测试网络的配置(https://developers.eos.io/eosio-nodeos/docs/local-single-node-testnet),少了 –plugin eosio::history_api_plugin,可根据自己的需要添加或减少配置
1.设置断点并开启调试
nodeos的入口在eosio/eos/programs/nodeos/main.cpp,单击行号左侧添加断点。再点击上图的标号2处,开启调试,看到如下信息:
可以进行常见的单步调试等,注意调试过程中的随意停止相当于杀死进程,会造成nodeos的database flag设置异常,下面会具体说明。
2.断点调试后,点击继续运行,会看到nodeos在生成块信息,如下图所示:
一般的查看直接打开相应的文件即可。但是原本熟悉一些IDE或编辑器工具的人需要设置下快捷键,方便源码查看(建议设置自己常用的快捷键)。我这里是部分参照Eclipse的快捷键设置。
在”文件“ -> ”首选项“ -> ”键盘快捷方式“ 中设置,如果想拷贝直接打开”keybindings.json“文件设置,我的部分快捷键如下:
// Place your key bindings in this file to overwrite the defaults
[
{
"key": "alt+left",
"command": "workbench.action.navigateBack"
},
{
"key": "alt+right",
"command": "workbench.action.navigateForward"
},
{
"key": "f3",
"command": "-editor.action.nextMatchFindAction",
"when": "editorFocus"
},
{
"key": "f3",
"command": "editor.action.goToDeclaration",
"when": "editorHasDefinitionProvider && editorTextFocus && !isInEmbeddedEditor"
},
{
"key": "ctrl+cmd+o",
"command": "workbench.action.files.openFileFolder"
},
{
"key": "cmd+o",
"command": "-workbench.action.files.openFileFolder"
},
{
"key": "cmd+o",
"command": "C_Cpp.Navigate",
"when": "editorTextFocus && editorLangId == 'cpp'"
}
]
如f3跳转到定义处,cmd+o打开函数导航,其实还有Ctrl+p匹配文件等等
1.database created by a different compiler, build, boost version, or operating system
如果之前编译后测试过nodeos,会出现如下错误信息
chainbase.cpp(72): Throw in function chainbase::database::database(const bfs::path &, chainbase::database::open_flags, uint64_t, bool)
Dynamic exception type:
…
std::exception::what: database created by a different compiler, build, boost version, or operating system
需要删除或者重命名之前的data文件夹,Ubuntu的在
~/.local/share/eosio/nodeos
Mac的默认在/Library/Application\ Support/eosio
2.The program ‘~/eos/eosio/eos/build/programs/nodeos/nodeos’ has exited with code 2 (0x00000002)
这个错误太笼统。你可以直接在nodeos的编译生成目录(源码目录的 build/programs/nodeos)下直接执行如:
./nodeos -e -p eosio –plugin eosio::chain_api_plugin
查看错误信息,会发现眼熟的信息如下:
1931158ms thread-0 chain_plugin.cpp:208 plugin_initialize ] initializing chain plugin
1931159ms thread-0 main.cpp:123 main ] database dirty flag set (likely due to unclean shutdown): replay required
解决方法一是同上述方法一样直接删除原始数据目录;另外也是同之前文章全面理解EOS——2.加入EOS主网和测试网 说过的,添加replay的配置即可。
参考文章
1.[EOS源码分析]4.EOS源码调试
2.在Linux中使用VS Code编译调试C++项目
转载请注明出处:http://blog.csdn.net/w7849516230,欢迎关注微信公众号“编程阳光”