Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
d0b31e20
Commit
d0b31e20
authored
May 27, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New debugger
parent
4fd267a7
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
258 additions
and
145 deletions
+258
-145
debugger.qml
ethereal/assets/debugger/debugger.qml
+206
-104
debugger.go
ethereal/ui/debugger.go
+52
-3
ui_lib.go
ethereal/ui/ui_lib.go
+0
-38
No files found.
ethereal/assets/debugger/debugger.qml
View file @
d0b31e20
...
@@ -7,108 +7,210 @@ import QtQuick.Controls.Styles 1.1
...
@@ -7,108 +7,210 @@ import QtQuick.Controls.Styles 1.1
import
Ethereum
1.0
import
Ethereum
1.0
ApplicationWindow
{
ApplicationWindow
{
id
:
debugWindow
visible
:
false
visible
:
false
title
:
"Debugger"
title
:
"Debugger"
minimumWidth
:
1280
minimumWidth
:
600
minimumHeight
:
900
minimumHeight
:
600
width
:
1290
width
:
800
height
:
900
height
:
600
SplitView
{
SplitView
{
anchors.fill
:
parent
anchors.fill
:
parent
property
var
asmModel
:
ListModel
{
property
var
asmModel
:
ListModel
{
id
:
asmModel
id
:
asmModel
}
}
TableView
{
TableView
{
id
:
asmTableView
id
:
asmTableView
width
:
200
width
:
200
TableViewColumn
{
role
:
"value"
;
title
:
""
;
width
:
100
}
TableViewColumn
{
role
:
"value"
;
title
:
""
;
width
:
100
}
model
:
asmModel
model
:
asmModel
}
}
Rectangle
{
Rectangle
{
color
:
"#00000000"
anchors.left
:
asmTableView
.
right
anchors.left
:
asmTableView
.
right
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
SplitView
{
SplitView
{
orientation
:
Qt
.
Vertical
orientation
:
Qt
.
Vertical
anchors.fill
:
parent
anchors.fill
:
parent
TableView
{
Rectangle
{
property
var
memModel
:
ListModel
{
color
:
"#00000000"
id
:
memModel
height
:
500
}
anchors.left
:
parent
.
left
height
:
parent
.
height
/
2
anchors.right
:
parent
.
right
width
:
parent
.
width
TableViewColumn
{
id
:
mnumColmn
;
role
:
"num"
;
title
:
"#"
;
width
:
50
}
TextArea
{
TableViewColumn
{
role
:
"value"
;
title
:
"Memory"
;
width
:
750
}
id
:
codeEditor
model
:
memModel
anchors.top
:
parent
.
top
}
anchors.bottom
:
parent
.
bottom
anchors.left
:
parent
.
left
SplitView
{
anchors.right
:
settings
.
left
orientation
:
Qt
.
Horizontal
}
TableView
{
property
var
debuggerLog
:
ListModel
{
Column
{
id
:
debuggerLog
id
:
settings
}
spacing
:
5
TableViewColumn
{
role
:
"value"
;
title
:
"Debug messages"
}
width
:
300
model
:
debuggerLog
height
:
parent
.
height
}
anchors.right
:
parent
.
right
TableView
{
anchors.top
:
parent
.
top
property
var
stackModel
:
ListModel
{
anchors.bottom
:
parent
.
bottom
id
:
stackModel
}
Label
{
height
:
parent
.
height
/
2
text
:
"Data"
width
:
parent
.
width
}
TableViewColumn
{
role
:
"value"
;
title
:
"Stack"
;
width
:
200
}
TextArea
{
model
:
stackModel
anchors.left
:
parent
.
left
}
anchors.right
:
parent
.
right
}
height
:
150
}
}
}
}
Label
{
statusBar
:
StatusBar
{
text
:
"Amount"
RowLayout
{
}
anchors.fill
:
parent
TextField
{
Button
{
id
:
txValue
property
var
enabled
:
true
width
:
200
id
:
debugNextButton
placeholderText
:
"Amount"
onClicked
:
{
validator
:
RegExpValidator
{
regExp
:
/
\d
*/
}
//db.next()
}
}
Label
{
text
:
"Next"
text
:
"Amount of gas"
}
}
}
TextField
{
}
id
:
txGas
width
:
200
function
setAsm
(
asm
)
{
validator
:
RegExpValidator
{
regExp
:
/
\d
*/
}
asmModel
.
append
({
asm
:
asm
})
text
:
"10000"
}
placeholderText
:
"Gas"
}
function
setInstruction
(
num
)
{
Label
{
asmTableView
.
selection
.
clear
()
text
:
"Gas price"
asmTableView
.
selection
.
select
(
num
-
1
)
}
}
TextField
{
id
:
txGasPrice
function
clearAsm
()
{
width
:
200
asmModel
.
clear
()
placeholderText
:
"Gas price"
}
text
:
"1000000000000"
validator
:
RegExpValidator
{
regExp
:
/
\d
*/
}
function
setMem
(
mem
)
{
}
memModel
.
append
({
num
:
mem
.
num
,
value
:
mem
.
value
})
}
}
}
function
clearMem
(){
memModel
.
clear
()
SplitView
{
}
orientation
:
Qt
.
Vertical
id
:
inspectorPane
function
setStack
(
stack
)
{
height
:
500
stackModel
.
append
({
value
:
stack
})
}
SplitView
{
function
addDebugMessage
(
message
){
orientation
:
Qt
.
Horizontal
debuggerLog
.
append
({
value
:
message
})
height
:
300
}
TableView
{
function
clearStack
()
{
id
:
stackTableView
stackModel
.
clear
()
property
var
stackModel
:
ListModel
{
}
id
:
stackModel
}
height
:
parent
.
height
width
:
300
TableViewColumn
{
role
:
"value"
;
title
:
"Stack"
;
width
:
200
}
model
:
stackModel
}
TableView
{
id
:
memoryTableView
property
var
memModel
:
ListModel
{
id
:
memModel
}
height
:
parent
.
height
width
:
parent
.
width
-
stackTableView
.
width
TableViewColumn
{
id
:
mnumColmn
;
role
:
"num"
;
title
:
"#"
;
width
:
50
}
TableViewColumn
{
role
:
"value"
;
title
:
"Memory"
;
width
:
750
}
model
:
memModel
}
}
SplitView
{
height
:
300
TableView
{
id
:
storageTableView
property
var
memModel
:
ListModel
{
id
:
storageModel
}
height
:
parent
.
height
width
:
parent
.
width
-
stackTableView
.
width
TableViewColumn
{
id
:
key
;
role
:
"key"
;
title
:
"#"
;
width
:
storageTableView
.
width
/
2
}
TableViewColumn
{
role
:
"value"
;
title
:
"value"
;
width
:
storageTableView
.
width
/
2
}
model
:
storageModel
}
}
}
}
}
}
statusBar
:
StatusBar
{
RowLayout
{
spacing
:
5
anchors.fill
:
parent
Button
{
property
var
enabled
:
true
id
:
debugStart
onClicked
:
{
dbg
.
debug
(
txValue
.
text
,
txGas
.
text
,
txGasPrice
.
text
,
codeEditor
.
text
)
}
text
:
"Debug"
}
Button
{
property
var
enabled
:
true
id
:
debugNextButton
onClicked
:
{
dbg
.
next
()
}
text
:
"Next"
}
}
}
function
setAsm
(
asm
)
{
console
.
log
(
"set asm"
,
asm
)
asmModel
.
append
({
asm
:
asm
})
}
function
setInstruction
(
num
)
{
asmTableView
.
selection
.
clear
()
asmTableView
.
selection
.
select
(
num
-
1
)
}
function
clearAsm
()
{
asmModel
.
clear
()
}
function
setMem
(
mem
)
{
memModel
.
append
({
num
:
mem
.
num
,
value
:
mem
.
value
})
}
function
clearMem
(){
memModel
.
clear
()
}
function
setStack
(
stack
)
{
stackModel
.
append
({
value
:
stack
})
}
function
addDebugMessage
(
message
){
debuggerLog
.
append
({
value
:
message
})
}
function
clearStack
()
{
stackModel
.
clear
()
}
function
clearStorage
()
{
storageModel
.
clear
()
}
function
setStorage
(
storage
)
{
storageModel
.
append
({
key
:
storage
.
key
,
value
:
storage
.
value
})
}
}
}
ethereal/ui/debugger.go
View file @
d0b31e20
...
@@ -30,13 +30,16 @@ func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
...
@@ -30,13 +30,16 @@ func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
}
}
func
(
self
*
DebuggerWindow
)
Show
()
{
func
(
self
*
DebuggerWindow
)
Show
()
{
context
:=
self
.
engine
.
Context
()
context
.
SetVar
(
"dbg"
,
self
)
go
func
()
{
go
func
()
{
self
.
win
.
Show
()
self
.
win
.
Show
()
self
.
win
.
Wait
()
self
.
win
.
Wait
()
}()
}()
}
}
func
(
self
*
DebuggerWindow
)
Debug
Tx
(
recipient
,
valueStr
,
gasStr
,
gasPriceStr
,
data
string
)
{
func
(
self
*
DebuggerWindow
)
Debug
(
valueStr
,
gasStr
,
gasPriceStr
,
data
string
)
{
state
:=
self
.
lib
.
eth
.
BlockChain
()
.
CurrentBlock
.
State
()
state
:=
self
.
lib
.
eth
.
BlockChain
()
.
CurrentBlock
.
State
()
script
,
err
:=
ethutil
.
Compile
(
data
)
script
,
err
:=
ethutil
.
Compile
(
data
)
...
@@ -50,14 +53,14 @@ func (self *DebuggerWindow) DebugTx(recipient, valueStr, gasStr, gasPriceStr, da
...
@@ -50,14 +53,14 @@ func (self *DebuggerWindow) DebugTx(recipient, valueStr, gasStr, gasPriceStr, da
self
.
lib
.
win
.
Root
()
.
Call
(
"clearAsm"
)
self
.
lib
.
win
.
Root
()
.
Call
(
"clearAsm"
)
for
_
,
str
:=
range
dis
{
for
_
,
str
:=
range
dis
{
self
.
lib
.
win
.
Root
()
.
Call
(
"setAsm"
,
str
)
self
.
win
.
Root
()
.
Call
(
"setAsm"
,
str
)
}
}
// Contract addr as test address
// Contract addr as test address
keyPair
:=
ethutil
.
GetKeyRing
()
.
Get
(
0
)
keyPair
:=
ethutil
.
GetKeyRing
()
.
Get
(
0
)
callerTx
:=
ethchain
.
NewContractCreationTx
(
ethutil
.
Big
(
valueStr
),
ethutil
.
Big
(
gasStr
),
ethutil
.
Big
(
gasPriceStr
),
script
)
callerTx
:=
ethchain
.
NewContractCreationTx
(
ethutil
.
Big
(
valueStr
),
ethutil
.
Big
(
gasStr
),
ethutil
.
Big
(
gasPriceStr
),
script
)
callerTx
.
Sign
(
keyPair
.
PrivateKey
)
callerTx
.
Sign
(
keyPair
.
PrivateKey
)
account
:=
self
.
lib
.
eth
.
StateManager
()
.
TransState
()
.
Get
StateObjec
t
(
keyPair
.
Address
())
account
:=
self
.
lib
.
eth
.
StateManager
()
.
TransState
()
.
Get
Accoun
t
(
keyPair
.
Address
())
contract
:=
ethchain
.
MakeContract
(
callerTx
,
state
)
contract
:=
ethchain
.
MakeContract
(
callerTx
,
state
)
callerClosure
:=
ethchain
.
NewClosure
(
account
,
contract
,
contract
.
Init
(),
state
,
ethutil
.
Big
(
gasStr
),
ethutil
.
Big
(
gasPriceStr
))
callerClosure
:=
ethchain
.
NewClosure
(
account
,
contract
,
contract
.
Init
(),
state
,
ethutil
.
Big
(
gasStr
),
ethutil
.
Big
(
gasPriceStr
))
...
@@ -84,3 +87,49 @@ func (self *DebuggerWindow) DebugTx(recipient, valueStr, gasStr, gasPriceStr, da
...
@@ -84,3 +87,49 @@ func (self *DebuggerWindow) DebugTx(recipient, valueStr, gasStr, gasPriceStr, da
func
(
self
*
DebuggerWindow
)
Next
()
{
func
(
self
*
DebuggerWindow
)
Next
()
{
self
.
Db
.
Next
()
self
.
Db
.
Next
()
}
}
type
Debugger
struct
{
win
*
qml
.
Window
N
chan
bool
done
bool
}
type
storeVal
struct
{
Key
,
Value
string
}
func
(
d
*
Debugger
)
halting
(
pc
int
,
op
ethchain
.
OpCode
,
mem
*
ethchain
.
Memory
,
stack
*
ethchain
.
Stack
,
stateObject
*
ethchain
.
StateObject
)
{
d
.
win
.
Root
()
.
Call
(
"setInstruction"
,
pc
)
d
.
win
.
Root
()
.
Call
(
"clearMem"
)
d
.
win
.
Root
()
.
Call
(
"clearStack"
)
d
.
win
.
Root
()
.
Call
(
"clearStorage"
)
addr
:=
0
for
i
:=
0
;
i
+
32
<=
mem
.
Len
();
i
+=
32
{
d
.
win
.
Root
()
.
Call
(
"setMem"
,
memAddr
{
fmt
.
Sprintf
(
"%03d"
,
addr
),
fmt
.
Sprintf
(
"% x"
,
mem
.
Data
()[
i
:
i
+
32
])})
addr
++
}
for
_
,
val
:=
range
stack
.
Data
()
{
d
.
win
.
Root
()
.
Call
(
"setStack"
,
val
.
String
())
}
stateObject
.
State
()
.
EachStorage
(
func
(
key
string
,
node
*
ethutil
.
Value
)
{
d
.
win
.
Root
()
.
Call
(
"setStorage"
,
storeVal
{
fmt
.
Sprintf
(
"% x"
,
key
),
fmt
.
Sprintf
(
"% x"
,
node
.
Str
())})
})
out
:
for
{
select
{
case
<-
d
.
N
:
break
out
default
:
}
}
}
func
(
d
*
Debugger
)
Next
()
{
if
!
d
.
done
{
d
.
N
<-
true
}
}
ethereal/ui/ui_lib.go
View file @
d0b31e20
...
@@ -2,7 +2,6 @@ package ethui
...
@@ -2,7 +2,6 @@ package ethui
import
(
import
(
"bitbucket.org/kardianos/osext"
"bitbucket.org/kardianos/osext"
"fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethutil"
...
@@ -171,40 +170,3 @@ func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string)
...
@@ -171,40 +170,3 @@ func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string)
func
(
ui
*
UiLib
)
Next
()
{
func
(
ui
*
UiLib
)
Next
()
{
ui
.
Db
.
Next
()
ui
.
Db
.
Next
()
}
}
type
Debugger
struct
{
win
*
qml
.
Window
N
chan
bool
done
bool
}
func
(
d
*
Debugger
)
halting
(
pc
int
,
op
ethchain
.
OpCode
,
mem
*
ethchain
.
Memory
,
stack
*
ethchain
.
Stack
)
{
d
.
win
.
Root
()
.
Call
(
"setInstruction"
,
pc
)
d
.
win
.
Root
()
.
Call
(
"clearMem"
)
d
.
win
.
Root
()
.
Call
(
"clearStack"
)
addr
:=
0
for
i
:=
0
;
i
+
32
<=
mem
.
Len
();
i
+=
32
{
d
.
win
.
Root
()
.
Call
(
"setMem"
,
memAddr
{
fmt
.
Sprintf
(
"%03d"
,
addr
),
fmt
.
Sprintf
(
"% x"
,
mem
.
Data
()[
i
:
i
+
32
])})
addr
++
}
for
_
,
val
:=
range
stack
.
Data
()
{
d
.
win
.
Root
()
.
Call
(
"setStack"
,
val
.
String
())
}
out
:
for
{
select
{
case
<-
d
.
N
:
break
out
default
:
}
}
}
func
(
d
*
Debugger
)
Next
()
{
if
!
d
.
done
{
d
.
N
<-
true
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment