diff options
author | Yoichi Hirai <i@yoichihirai.com> | 2016-09-30 18:22:42 +0800 |
---|---|---|
committer | Yoichi Hirai <i@yoichihirai.com> | 2016-09-30 23:36:00 +0800 |
commit | bb6115b737a05e3b8bf70ff2ad74c703589627cb (patch) | |
tree | 72dc4e8df47729e283735a7a3ecb59930c66b2c5 /core/vm/logger.go | |
parent | b4cc8cbac4c1756c179e497c53ee83515669fe13 (diff) | |
download | go-tangerine-bb6115b737a05e3b8bf70ff2ad74c703589627cb.tar go-tangerine-bb6115b737a05e3b8bf70ff2ad74c703589627cb.tar.gz go-tangerine-bb6115b737a05e3b8bf70ff2ad74c703589627cb.tar.bz2 go-tangerine-bb6115b737a05e3b8bf70ff2ad74c703589627cb.tar.lz go-tangerine-bb6115b737a05e3b8bf70ff2ad74c703589627cb.tar.xz go-tangerine-bb6115b737a05e3b8bf70ff2ad74c703589627cb.tar.zst go-tangerine-bb6115b737a05e3b8bf70ff2ad74c703589627cb.zip |
vm, ethapi: add `limit` option to traceTransaction
that specifies the maximum number of elements in the `structLogs`
output. This option is useful for debugging a transaction that
involves a large number of repetition.
For example,
```
debug.traceTransaction(tx, {disableStorage: true, limit: 2})
```
shows at most the first two steps in the `structLogs`.
Diffstat (limited to 'core/vm/logger.go')
-rw-r--r-- | core/vm/logger.go | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/core/vm/logger.go b/core/vm/logger.go index ae62b6b57..9e13d703b 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -42,6 +42,7 @@ type LogConfig struct { DisableStack bool // disable stack capture DisableStorage bool // disable storage capture FullStorage bool // show full storage (slow) + Limit int // maximum length of output, but zero means unlimited } // StructLog is emitted to the Environment each cycle and lists information about the current internal state @@ -64,7 +65,7 @@ type StructLog struct { // Note that reference types are actual VM data structures; make copies // if you need to retain them beyond the current call. type Tracer interface { - CaptureState(env Environment, pc uint64, op OpCode, gas, cost *big.Int, memory *Memory, stack *Stack, contract *Contract, depth int, err error) + CaptureState(env Environment, pc uint64, op OpCode, gas, cost *big.Int, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error } // StructLogger is an EVM state logger and implements Tracer. @@ -93,7 +94,12 @@ func NewStructLogger(cfg *LogConfig) *StructLogger { // captureState logs a new structured log message and pushes it out to the environment // // captureState also tracks SSTORE ops to track dirty values. -func (l *StructLogger) CaptureState(env Environment, pc uint64, op OpCode, gas, cost *big.Int, memory *Memory, stack *Stack, contract *Contract, depth int, err error) { +func (l *StructLogger) CaptureState(env Environment, pc uint64, op OpCode, gas, cost *big.Int, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error { + // check if already accumulated the specified number of logs + if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) { + return TraceLimitReachedError + } + // initialise new changed values storage container for this contract // if not present. if l.changedValues[contract.Address()] == nil { @@ -152,6 +158,7 @@ func (l *StructLogger) CaptureState(env Environment, pc uint64, op OpCode, gas, log := StructLog{pc, op, new(big.Int).Set(gas), cost, mem, stck, storage, env.Depth(), err} l.logs = append(l.logs, log) + return nil } // StructLogs returns a list of captured log entries |