首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在solidity中debug?

最近在重新部署区块链借贷项目compound,出现了好多次VM 异常:还原。 Error: VM Exception while processing transaction: revert....十分绝望,整理外网上一些debug策略,帮助同样陷于缺少console.log()来debug-solidity的同学打开思路 如何更好的使用Remix调试合约? 应该在Remix中编写合同。...经典错误异常表 Wrapping over/under:经典溢出错误,Solidity 中的数字存储空间有限,使数字大于其分配的存储空间,就会溢出到最小值 OUT_OF_GAS: "out of gas...(例如数组超出范围)时会发生此错误 INVALID_OPCODE: "invalid opcode” 试图在某个地方执行不存在的操作码 REVERT: "revert” 某处坏了。...truffle debug 交易哈希 靠他的单步执行断点调试了,虽然remix也基本可以做到类似的事情 为何事件和空白的代码行会失败

1.2K30

Debug和Release之本质区别

void fn(void) {   int i;   i = 1;   int a[4];   {     int j;     j = 1;   }   a[-1] = 1;//当然错误不会这么明显,例如下标是变量..._DEBUG 与 NDEBUG :当定义了 _DEBUG ,assert() 函数会被编译,而 NDEBUG 不被编译。除此之外,VC++中还有一系列断言宏。...(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略 FPO )  通常 /GZ 选项会造成 Debug 版出错而 Release 版正常的现象,因为 Release 版中未初始化的变量是随机的...怎样“调试” Release 版的程序     遇到 Debug 成功但 Release 失败,显然是一件很沮丧的事,而且往往无从下手。...但如果一找不出,以下给出了一些在这种情况下的策略。 1.  前面已经提过,Debug 和 Release 只是一组编译选项的差别,实际上并没有什么定义能区分二者。

3.7K90
您找到你想要的搜索结果了吗?
是的
没有找到

C语言C++中assert的用法

根据提示我们很快就能定位到错误点,就在assert(i++)处;既然assert这么便于定位出错点,在工程中使用它就显得很有必要;但其也有一定的使用规则; 断言语句不会永远被执行,可以屏蔽也可以启用,这就要求...每个assert只检验一个条件,因为同时检验多个条件,如果断言失败,我们就无法直观的判断哪个条件失败; 无法直观的判断哪个条件失败: assert(nOffset>=0 && nOffset+nSize...有的地方,assert不能代替条件过滤; 程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。...断言assert 是仅在Debug 版本起作用的宏,它用于检查"不应该"发生的情况。 5....如果我们能在代码中合理的使用assert,能使我们创建更稳定、质量更好且不易于出错的代码;当需要在一个值为FALSE时中断当前操作的话就可以使用断言

1.3K20

C 语言 C++ 中 assert 的用法

根据提示我们很快就能定位到错误点,就在assert(i++)处;既然assert这么便于定位出错点,在工程中使用它就显得很有必要;但其也有一定的使用规则; 断言语句不会永远被执行,可以屏蔽也可以启用,这就要求...每个assert只检验一个条件,因为同时检验多个条件,如果断言失败,我们就无法直观的判断哪个条件失败; 无法直观的判断哪个条件失败: assert(nOffset>=0 && nOffset+nSize...有的地方,assert不能代替条件过滤; 程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。...断言assert 是仅在Debug 版本起作用的宏,它用于检查"不应该"发生的情况。 5....如果我们能在代码中合理的使用assert,能使我们创建更稳定、质量更好且不易于出错的代码;当需要在一个值为FALSE时中断当前操作的话就可以使用断言

2.9K00

C语言 | C++中assert的用法

根据提示我们很快就能定位到错误点,就在assert(i++)处;既然assert这么便于定位出错点,在工程中使用它就显得很有必要;但其也有一定的使用规则; 断言语句不会永远被执行,可以屏蔽也可以启用,这就要求...每个assert只检验一个条件,因为同时检验多个条件,如果断言失败,我们就无法直观的判断哪个条件失败; 无法直观的判断哪个条件失败: assert(nOffset>=0 && nOffset+nSize...有的地方,assert不能代替条件过滤; 程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。...断言assert 是仅在Debug 版本起作用的宏,它用于检查"不应该"发生的情况。 5....如果我们能在代码中合理的使用assert,能使我们创建更稳定、质量更好且不易于出错的代码;当需要在一个值为FALSE时中断当前操作的话就可以使用断言

1.7K88

Python Debug调试技巧

有时候通过程序运行时的报错可以很容易的找到出错的位置,但是有时候必须得通过调试程序才能找出我们的错误,以下介绍一些debug调试技巧。...方法二 利用断言 凡是可以用print()来辅助查看的地方,都可以用断言(assert)来替代,如果断言失败,assert语句本身就会抛出AssertionError。...= 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错 #如果断言失败,assert语句本身就会抛出AssertionError assert n!...这时,启动Python解释器可以用-O参数来关闭assert 方法三 打断点 1.添加断点:直接在标记处点击鼠标左键。取消断点,在同一个位置此点击即可。...2.利用Debug运行代码(点击七星瓢虫图标或者通过“运行->调试”),快捷键:alt+shift+F9 ? ?

3.4K10

Python Debug调试技巧

有时候通过程序运行时的报错可以很容易的找到出错的位置,但是有时候必须得通过调试程序才能找出我们的错误,以下介绍一些debug调试技巧。...方法二 利用断言 凡是可以用print()来辅助查看的地方,都可以用断言(assert)来替代,如果断言失败,assert语句本身就会抛出AssertionError。...= 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错 #如果断言失败,assert语句本身就会抛出AssertionError assert n!...这时,启动Python解释器可以用-O参数来关闭assert 方法三 打断点 1.添加断点:直接在标记处点击鼠标左键。取消断点,在同一个位置此点击即可。...2.利用Debug运行代码(点击七星瓢虫图标或者通过“运行->调试”),快捷键:alt+shift+F9 ? ?

74320

Python Debug调试技巧

Debug 对于任何coding人士都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug。...有时候通过程序运行时的报错可以很容易的找到出错的位置,但是有时候必须得通过调试程序才能找出我们的错误,以下介绍一些debug调试技巧。...方法二 利用断言 凡是可以用print()来辅助查看的地方,都可以用断言(assert)来替代,如果断言失败,assert语句本身就会抛出AssertionError。...= 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错 #如果断言失败,assert语句本身就会抛出AssertionError assert n!...这时,启动Python解释器可以用-O参数来关闭assert 方法三 打断点 1.添加断点:直接在标记处点击鼠标左键。取消断点,在同一个位置此点击即可。

6.1K30

(断言函数详解)

显示的消息(即错误信息)具体内容取决于特定的库实现,但至少应包括:断言失败的表达式、源文件的名称以及发生错误的行号。...通常的表达式格式为: Assertion failed: expression, file filename, line line number (断言失败:表达式,文件名,行号) 如果在包含...也即,虽然使用了assert函数来报错,但同时检测多个条件,断言失败,我们还是无法清楚的立即知道到底是哪个条件出错了,所以我们应当在使用assert函数让它只检测一个条件....断言assert 是仅在Debug 版本起作用的宏,它用于检查"不应该"发生的情况,如果编译为Release版本则被忽略....使用断言对函数的参数进行确认。 在编写函数,要进行反复的考查,并且自问:"我打算做哪些假定?"一旦确定了的假定,就要使用断言对假定进行检查。

9810

CC++学习笔记八(断言与异常处理)

也便是说如果需要用到断言,用户可以通过重定义自己的ASSERT。...避免在断言表达式中使用改变上下文的语句  在assert宏只有在Debug版本中情况下,应该避免断言表达式中使用改变环境的语句。  如下例子因为断言语句的缘故,将导致不同的编译版本产生不同的结果。 ...因errno是一个全局变量,在调用不同系统调用或者库函数失败都有可能修改它的值,因为在使用errno,应先将其清0      errno = 0;     FILE *fp = fopen("test.txt...这个要判断errno的值。如下例中,会打印出错误的信息。     ...小结  C语言中,使用函数的返回值来标志函数是否执行成功(默认成功返回1,失败返回0)当使用接口,必须对函数进行正确性的验证,检查它的返回值,并且对每个错误的返回值进行相应的处理以及提示。

63230

CC++ 学习笔记八(断言与异常处理)

也便是说如果需要用到断言,用户可以通过重定义自己的ASSERT。...避免在断言表达式中使用改变上下文的语句 在assert宏只有在Debug版本中情况下,应该避免断言表达式中使用改变环境的语句。 如下例子因为断言语句的缘故,将导致不同的编译版本产生不同的结果。...因errno是一个全局变量,在调用不同系统调用或者库函数失败都有可能修改它的值,因为在使用errno,应先将其清0 errno = 0; FILE *fp = fopen("test.txt...这个要判断errno的值。如下例中,会打印出错误的信息。...小结 C语言中,使用函数的返回值来标志函数是否执行成功(默认成功返回1,失败返回0)当使用接口,必须对函数进行正确性的验证,检查它的返回值,并且对每个错误的返回值进行相应的处理以及提示。

2.3K00

Python 自动化指南(繁琐工作自动化)第二版:十一、调试

幸运的是,有一些工具和技术可以确定您的代码到底在做什么以及哪里出错了。首先,您将看到日志记录和断言,这两个特性可以帮助您尽早发现 bug。一般来说,越早发现错误,就越容易修复。...断言 断言是一个健全检查,以确保你的代码没有做一些明显错误的事情。这些健全性检查是由assert语句执行的。如果健全性检查失败,则引发一个AssertionError异常。...只有当程序正在开发断言才应该失败;用户永远不会在完成的程序中看到断言错误。对于程序在正常操作中可能遇到的错误(比如找不到文件或者用户输入了无效数据),抛出一个异常,而不是用assert语句检测它。...当用户开发一个程序并需要在一个要求最高性能的生产环境中运行它,他们可能会禁用断言。(尽管,在许多情况下,他们会让断言保持启用状态。) 断言也不能代替全面的测试。...断言只针对程序不应该试图恢复并且应该快速失败的错误。否则,您应该引发异常。 异常可以被try和except语句捕获和处理。

1.4K40

C语言assert函数(isspace函数)

tmp_dest+len); while(len –) *tmp_dest ++ = *tmp_src ++; return dest; } 除此之外,建议每一个 assert 宏只检验一个条件,这样做的好处就是当断言失败...试想一下,如果在一个断言中同时检验多个条件,当断言失败,我们将很难直观地判断哪个条件失败。因此,下面的断言代码应该更好一些,尽管这样显得有些多此一举: assert(dest!...这个时候,断言就可以发挥作用,用来确诊到底是哪部分出现了问题而导致子程序调用失败。在清理所有缺陷之后,就建立了内外有别的信用体系。等到发行版的时候,这些断言就没有存在的必要了。...换句话说,在调用代码正确的情况下传递给 source 参数的值必然不为 NULL,如果断言失败,说明调用代码中有错误,必须修改。因此,它属于断言的正常使用情况。...即对 malloc 函数而言,当内存不足导致内存分配失败就会返回 NULL,因此这里不应该使用 assert 宏进行处理,而应该使用错误处理代码。

88030

Python学习笔记(八)——错误、调试、测试

ZeroDivisionError as e: print('except:', e) finally: print('finally...') print('END') 当我们认为某些代码可能会出错...如果断言失败,assert语句本身就会抛出AssertionError 程序中如果到处充斥着assert,和print()相比也好不到哪去。...,info,warning,error等几个级别,当我们指定level=INFO,logging.debug就不起作用了。...最常用的断言就是assertEqual(): self.assertEqual(abs(-1), 1) # 断言函数返回的结果与1相等 另一种重要的断言就是期待抛出指定类型的Error,比如通过d[‘empty...’]访问不存在的key断言会抛出KeyError: with self.assertRaises(KeyError): value = d['empty'] 运行单元测试 一旦编写好单元测试

75920
领券