从零学本体dApp开发(15):本体智能合约运行出错如何调试?

原创 | 工匠 (来自本体社区的技术人员)

---------------

写在前面

最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来,一方面便于自己梳理学到的东西,另一方面希望可以通过笔记的共享,能使本体后来的开发者少走弯路。

 

由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、Mickey、雪飞的逆袭、Andy季、周佩文等)耐心地为我解答各种各样的问题,本体有你们,真好!

 

学习本篇的目的:

    我们在调试智能合约的时候,虽然编译通过了,但是有时候运行结果不是我们想要的,这时候我们就要通过一些手段来调试程序,SmartX为我们提供了非常便利的调试工具。

 

目录:

1. 调试功能简介

2. 查看虚拟机状态

3. 如何进行调试?

1.调试功能简介

 

调试时经常用到的工具如下图的红色字体处:

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第1张图片

 

1.1 set break point 设置断点

默认点击“run”的时候,程序是全速执行的,我们可以通过设置断点,让程序停在那一步,方便查看变量的值,点击左侧的行数即可设置断点

 

1.2 step over

单行调试,如果被执行行是函数调用,则程序跳过函数的执行内容,直接运行到函数调用的下一行

 

1.3 step into

逐行调试,如果被调用行是函数调用,会跳入到被调用处继续执行

 

1.4 stop

点击“debug”后,程序开始运行后,“debug”会变成”运行中“,下面三个按钮都不能按了,如下图

 

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第2张图片

要想结束本次调试,点击“stop”按钮即可

 

1.5 opcode debug

Opcode 级别的调试,属于高级功能。本功能需要点开Evaluation Stack 和 Alt Stack来观察

 

2.查看虚拟机状态

在调试的过程中,我们可以查看虚拟机状态,便于我们分析,如下图:

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第3张图片

 

2.1 logs 日志

    会打印出,合约当前执行的一些相关信息,比如编译成功,部署成功等

 

2.2 Locals 局部变量

    合约中Local variable的状态,

 

2.3 Storages

    合约中的key,value状态,都是以hex string 或者hex number 形式存储

 

2.4 Evaluation Stack

虚拟机的计算栈,即正在栈中被计算的变量

 

2.5 Alt Stack

    虚拟机的备用栈,关于计算栈以及备用栈的设计,请参考ontology的虚拟机模块源码

 

2.6 History

虚拟机所有执行的opcode的历史

 

 

3.如何进行调试

 

3.1 编写与编译

    代码写好后,编译通过,如下图,我们写了一个便于调试的加法程序,

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第4张图片

 

3.2 运行

    编译过后我们不需要部署,直接运行,可以在程序中设置一些断点,如上图中低9行和12行出现了红色方框处,

选择运行函数为“Add”,设定两个参数为“Integer”,值设为1和1 ;

点击“debug”,可以看到第9行变成了绿色方框,说明程序已经运行到这个断点出了,如下图

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第5张图片

 

3.2 查看变量的值

    程序运行到断点出我们就可以查看变量值了,点击“Locals”标签,如下:

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第6张图片

可以看到a的值为2,b的值为1

 

3.3 继续执行下一步

    点击向下的箭头,程序就往下执行一部,如下图,程序从第9步运行到了第10步,

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第7张图片

 

3.4 继续全速执行

    如果不想单步执行了,可以点击“Continue”,程序会一直往下执行直到下一个断点,如下图,程序运行到了12行,

从零学本体dApp开发(15):本体智能合约运行出错如何调试?_第8张图片

3.5 结束运行

    如果想结束运行,直接点击“stop”就停止了。

 

写在最后

希望有更多的小伙伴参与到本体开发学习中来,让我们共同为本体的生态建设添砖加瓦!感兴趣的小伙伴可以联系我,共同学习!

 

你可能感兴趣的:(开发者杂谈,dApp,本体Ontology,区块链,dApp)