全面理解EOS——5.EOS原始碼除錯與閱讀
EOS的理解離不開原始碼的閱讀,而單步除錯能在閱讀原始碼出現困惑時為你解開迷霧。
每個人在不同系統下都有自己的喜歡的工具來閱讀原始碼,如在Windows下使用SourceInsight,跨平臺的開源工具Eclipse,還有收費的CLion等等,此處介紹並測試使用的是vscode(Visual Studio Code),是微軟的一款開源的跨平臺編輯器,配置除錯EOS原始碼非常方便。如果你還沒有趁手的工具,可以試試上述的幾個。
環境準備
1.測試環境:
Ubuntu 16.04 LTS
macOS High Sierra(10.13.3)
2.原始碼及編譯參考全面理解EOS——1.原始碼編譯及執行
vscode配置
1.安裝cpptools擴充套件
安裝完vscode後,還有安裝cpptools擴充套件,如下圖所示:
2.開啟eosio原始碼檔案
在首次啟動vscode後的歡迎頁面,點選選擇“開啟資料夾”,選擇eos的原始碼目錄即可
3.配置除錯資訊
點選左側“除錯”,選擇“新增配置”,會開啟launch.json檔案,按圖中配置即可:
此處是希望除錯nodeos程式,因此配置program路徑是你的nodeos編譯生成的目錄,另外啟動引數args的配置,這裡是參考官方文件上啟動單節點測試網路的配置(
除錯
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的配置即可。