Skip to content
This repository was archived by the owner on Oct 28, 2021. It is now read-only.

Commit 1053ead

Browse files
committed
tracing: random dump
1 parent 917d4b5 commit 1053ead

File tree

2 files changed

+54
-27
lines changed

2 files changed

+54
-27
lines changed

libevm/EVMC.cpp

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,27 +53,13 @@ EVM::Result EVM::execute(ExtVMFace& _ext, int64_t gas)
5353
EVMC::EVMC(evmc_instance* _instance) : EVM(_instance)
5454
{
5555
static const auto tracer = [](evmc_tracer_context * _context, size_t _codeOffset,
56-
evmc_status_code _statusCode, int64_t _gasLeft, size_t _stackNumItems,
57-
evmc_uint256be const* _pushedStackItem, size_t _memorySize,
56+
evmc_status_code _statusCode, int64_t _gasLeft, size_t /*_stackNumItems*/,
57+
evmc_uint256be const* /*_pushedStackItem*/, size_t /*_memorySize*/,
5858
size_t /*changed_memory_offset*/, size_t /*changed_memory_size*/,
5959
uint8_t const* /*changed_memory*/) noexcept
6060
{
6161
EVMC* evmc = reinterpret_cast<EVMC*>(_context);
62-
63-
// TODO: It might be easier to just pass instruction from VM.
64-
char const* name = evmc->m_instructionNames[evmc->m_code[_codeOffset]];
65-
66-
std::ostringstream logMessage;
67-
logMessage << "EVMC "
68-
<< " " << evmc->m_step++ << " " << _codeOffset << " " << name << " "
69-
<< _statusCode << " " << _gasLeft << " " << _stackNumItems;
70-
71-
if (_pushedStackItem)
72-
logMessage << " +[" << fromEvmC(*_pushedStackItem) << "]";
73-
74-
logMessage << " " << _memorySize;
75-
76-
LOG(evmc->m_vmTraceLogger) << logMessage.str();
62+
evmc->trace.emplace_back(InstructionTrace{evmc->m_code[_codeOffset], _codeOffset, _statusCode, _gasLeft});
7763
};
7864

7965
_instance->set_tracer(_instance, tracer, reinterpret_cast<evmc_tracer_context*>(this));
@@ -94,18 +80,18 @@ owning_bytes_ref EVMC::exec(u256& io_gas, ExtVMFace& _ext, const OnOpFunc& _onOp
9480
assert(_ext.depth <= static_cast<size_t>(std::numeric_limits<int32_t>::max()));
9581

9682
m_code = bytesConstRef{&_ext.code};
97-
m_step = 0;
9883

99-
// FIXME: EVMC revision found twice.
100-
m_instructionNames = evmc_get_instruction_names_table(toRevision(_ext.evmSchedule()));
84+
auto gas = static_cast<int64_t>(io_gas);
10185

86+
calls.emplace_back(CallTrace{static_cast<int>(_ext.depth),
87+
_ext.isCreate ? EVMC_CREATE : EVMC_CALL, trace.size(), trace.size(), gas});
10288

103-
auto gas = static_cast<int64_t>(io_gas);
104-
LOG(m_vmTraceLogger) << "EVMC message START " << _ext.depth << " " << _ext.caller << " -> "
105-
<< _ext.myAddress << " gas: " << gas << "\n";
10689
EVM::Result r = execute(_ext, gas);
107-
LOG(m_vmTraceLogger) << "EVMC message END " << _ext.depth << " status: " << r.status()
108-
<< " gas left: " << r.gasLeft() << "\n";
90+
91+
calls.back().end = trace.size();
92+
93+
if (_ext.depth == 0)
94+
dumpTrace();
10995

11096
switch (r.status())
11197
{
@@ -171,5 +157,24 @@ evmc_revision EVM::toRevision(EVMSchedule const& _schedule)
171157
return EVMC_HOMESTEAD;
172158
return EVMC_FRONTIER;
173159
}
160+
161+
void EVMC::dumpTrace()
162+
{
163+
auto names = evmc_get_instruction_names_table(EVMC_LATEST_REVISION);
164+
165+
for (auto& c : calls)
166+
{
167+
std::cout << "call " << c.kind << " " << c.gas << "\n";
168+
for (size_t i = c.begin; i < c.end; ++i)
169+
{
170+
std::cout << names[trace[i].opcode] << "\n";
171+
}
172+
std::cout << "endcall \n";
173+
}
174+
175+
calls.clear();
176+
trace.clear();
177+
}
178+
174179
} // namespace eth
175180
} // namespace dev

libevm/EVMC.h

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,25 @@ class EVM
8282
};
8383

8484

85+
86+
struct InstructionTrace
87+
{
88+
uint8_t opcode;
89+
size_t codeOffset;
90+
evmc_status_code statusCode;
91+
int64_t gasLeft;
92+
};
93+
94+
struct CallTrace
95+
{
96+
int depth;
97+
evmc_call_kind kind;
98+
size_t begin;
99+
size_t end;
100+
int64_t gas;
101+
};
102+
103+
85104
/// The wrapper implementing the VMFace interface with a EVMC VM as a backend.
86105
class EVMC : public EVM, public VMFace
87106
{
@@ -92,10 +111,13 @@ class EVMC : public EVM, public VMFace
92111

93112
private:
94113
bytesConstRef m_code;
95-
int m_step = 0;
96-
char const* const* m_instructionNames = nullptr;
97114

98115
Logger m_vmTraceLogger{createLogger(VerbosityTrace, "vmtrace")};
116+
117+
std::vector<CallTrace> calls;
118+
std::vector<InstructionTrace> trace;
119+
120+
void dumpTrace();
99121
};
100122
}
101123
}

0 commit comments

Comments
 (0)