1. 程式人生 > >全面理解EOS——5.EOS原始碼除錯與閱讀

全面理解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.原始碼編譯及執行

需要注意的是,在執行eosio_build.sh時,加上 -o Debug 引數。

vscode配置

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的配置即可。