Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
HugeYuan
delve
提交
a71f218e
D
delve
项目概览
HugeYuan
/
delve
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
delve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a71f218e
编写于
6月 12, 2015
作者:
D
Derek Parker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rename: s/BreakPoint/Breakpoint/
上级
98e7089d
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
151 addition
and
151 deletion
+151
-151
proctl/arch.go
proctl/arch.go
+5
-5
proctl/breakpoints.go
proctl/breakpoints.go
+25
-25
proctl/proctl.go
proctl/proctl.go
+20
-20
proctl/proctl_darwin.go
proctl/proctl_darwin.go
+2
-2
proctl/proctl_linux.go
proctl/proctl_linux.go
+2
-2
proctl/proctl_test.go
proctl/proctl_test.go
+8
-8
proctl/threads.go
proctl/threads.go
+8
-8
service/api/types.go
service/api/types.go
+4
-4
service/client.go
service/client.go
+8
-8
service/debugger/debugger.go
service/debugger/debugger.go
+25
-25
service/rest/client.go
service/rest/client.go
+10
-10
service/rest/integration_test.go
service/rest/integration_test.go
+13
-13
service/rest/server.go
service/rest/server.go
+14
-14
terminal/command.go
terminal/command.go
+7
-7
未找到文件。
proctl/arch.go
浏览文件 @
a71f218e
...
...
@@ -7,7 +7,7 @@ type Arch interface {
BreakpointInstruction
()
[]
byte
BreakpointSize
()
int
CurgInstructions
()
[]
byte
HardwareBreak
Points
()
[]
*
BreakP
oint
HardwareBreak
points
()
[]
*
Breakp
oint
}
type
AMD64
struct
{
...
...
@@ -15,7 +15,7 @@ type AMD64 struct {
breakInstruction
[]
byte
breakInstructionLen
int
curgInstructions
[]
byte
hardwareBreak
Points
[]
*
BreakP
oint
// Slice of hardware breakpoints
hardwareBreak
points
[]
*
Breakp
oint
// Slice of hardware breakpoints
}
func
AMD64Arch
()
*
AMD64
{
...
...
@@ -42,7 +42,7 @@ func AMD64Arch() *AMD64 {
breakInstruction
:
breakInstr
,
breakInstructionLen
:
1
,
curgInstructions
:
curg
,
hardwareBreak
Points
:
make
([]
*
BreakP
oint
,
4
),
hardwareBreak
points
:
make
([]
*
Breakp
oint
,
4
),
}
}
...
...
@@ -62,6 +62,6 @@ func (a *AMD64) CurgInstructions() []byte {
return
a
.
curgInstructions
}
func
(
a
*
AMD64
)
HardwareBreak
Points
()
[]
*
BreakP
oint
{
return
a
.
hardwareBreak
P
oints
func
(
a
*
AMD64
)
HardwareBreak
points
()
[]
*
Breakp
oint
{
return
a
.
hardwareBreak
p
oints
}
proctl/breakpoints.go
浏览文件 @
a71f218e
...
...
@@ -8,7 +8,7 @@ import (
// Represents a single breakpoint. Stores information on the break
// point including the byte of data that originally was stored at that
// address.
type
Break
P
oint
struct
{
type
Break
p
oint
struct
{
// File & line information for printing.
FunctionName
string
File
string
...
...
@@ -22,13 +22,13 @@ type BreakPoint struct {
reg
int
// If hardware breakpoint, what debug register it belongs to.
}
func
(
bp
*
Break
P
oint
)
String
()
string
{
func
(
bp
*
Break
p
oint
)
String
()
string
{
return
fmt
.
Sprintf
(
"Breakpoint %d at %#v %s:%d"
,
bp
.
ID
,
bp
.
Addr
,
bp
.
File
,
bp
.
Line
)
}
// Clear this breakpoint appropriately depending on whether it is a
// hardware or software breakpoint.
func
(
bp
*
Break
Point
)
Clear
(
thread
*
ThreadContext
)
(
*
BreakP
oint
,
error
)
{
func
(
bp
*
Break
point
)
Clear
(
thread
*
ThreadContext
)
(
*
Breakp
oint
,
error
)
{
if
bp
.
hardware
{
if
err
:=
clearHardwareBreakpoint
(
bp
.
reg
,
thread
.
Id
);
err
!=
nil
{
return
nil
,
err
...
...
@@ -43,13 +43,13 @@ func (bp *BreakPoint) Clear(thread *ThreadContext) (*BreakPoint, error) {
// Returned when trying to set a breakpoint at
// an address that already has a breakpoint set for it.
type
Break
P
ointExistsError
struct
{
type
Break
p
ointExistsError
struct
{
file
string
line
int
addr
uint64
}
func
(
bpe
Break
P
ointExistsError
)
Error
()
string
{
func
(
bpe
Break
p
ointExistsError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"Breakpoint exists at %s:%d at %x"
,
bpe
.
file
,
bpe
.
line
,
bpe
.
addr
)
}
...
...
@@ -65,7 +65,7 @@ func (iae InvalidAddressError) Error() string {
// Returns whether or not a breakpoint has been set for the given address.
func
(
dbp
*
DebuggedProcess
)
BreakpointExists
(
addr
uint64
)
bool
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
P
oints
()
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
p
oints
()
{
// TODO(darwin)
if
runtime
.
GOOS
==
"darwin"
{
break
...
...
@@ -74,11 +74,11 @@ func (dbp *DebuggedProcess) BreakpointExists(addr uint64) bool {
return
true
}
}
_
,
ok
:=
dbp
.
Break
P
oints
[
addr
]
_
,
ok
:=
dbp
.
Break
p
oints
[
addr
]
return
ok
}
func
(
dbp
*
DebuggedProcess
)
newBreakpoint
(
fn
,
f
string
,
l
int
,
addr
uint64
,
data
[]
byte
,
temp
bool
)
*
Break
P
oint
{
func
(
dbp
*
DebuggedProcess
)
newBreakpoint
(
fn
,
f
string
,
l
int
,
addr
uint64
,
data
[]
byte
,
temp
bool
)
*
Break
p
oint
{
var
id
int
if
temp
{
dbp
.
tempBreakpointIDCounter
++
...
...
@@ -87,7 +87,7 @@ func (dbp *DebuggedProcess) newBreakpoint(fn, f string, l int, addr uint64, data
dbp
.
breakpointIDCounter
++
id
=
dbp
.
breakpointIDCounter
}
return
&
Break
P
oint
{
return
&
Break
p
oint
{
FunctionName
:
fn
,
File
:
f
,
Line
:
l
,
...
...
@@ -98,23 +98,23 @@ func (dbp *DebuggedProcess) newBreakpoint(fn, f string, l int, addr uint64, data
}
}
func
(
dbp
*
DebuggedProcess
)
newHardwareBreakpoint
(
fn
,
f
string
,
l
int
,
addr
uint64
,
data
[]
byte
,
temp
bool
,
reg
int
)
*
Break
P
oint
{
func
(
dbp
*
DebuggedProcess
)
newHardwareBreakpoint
(
fn
,
f
string
,
l
int
,
addr
uint64
,
data
[]
byte
,
temp
bool
,
reg
int
)
*
Break
p
oint
{
bp
:=
dbp
.
newBreakpoint
(
fn
,
f
,
l
,
addr
,
data
,
temp
)
bp
.
hardware
=
true
bp
.
reg
=
reg
return
bp
}
func
(
dbp
*
DebuggedProcess
)
setBreakpoint
(
tid
int
,
addr
uint64
,
temp
bool
)
(
*
Break
P
oint
,
error
)
{
func
(
dbp
*
DebuggedProcess
)
setBreakpoint
(
tid
int
,
addr
uint64
,
temp
bool
)
(
*
Break
p
oint
,
error
)
{
var
f
,
l
,
fn
=
dbp
.
goSymTable
.
PCToLine
(
uint64
(
addr
))
if
fn
==
nil
{
return
nil
,
InvalidAddressError
{
address
:
addr
}
}
if
dbp
.
BreakpointExists
(
addr
)
{
return
nil
,
Break
P
ointExistsError
{
f
,
l
,
addr
}
return
nil
,
Break
p
ointExistsError
{
f
,
l
,
addr
}
}
// Try and set a hardware breakpoint.
for
i
,
v
:=
range
dbp
.
arch
.
HardwareBreak
P
oints
()
{
for
i
,
v
:=
range
dbp
.
arch
.
HardwareBreak
p
oints
()
{
// TODO(darwin)
if
runtime
.
GOOS
==
"darwin"
{
break
...
...
@@ -125,8 +125,8 @@ func (dbp *DebuggedProcess) setBreakpoint(tid int, addr uint64, temp bool) (*Bre
return
nil
,
fmt
.
Errorf
(
"could not set hardware breakpoint on thread %d: %s"
,
t
,
err
)
}
}
dbp
.
arch
.
HardwareBreak
P
oints
()[
i
]
=
dbp
.
newHardwareBreakpoint
(
fn
.
Name
,
f
,
l
,
addr
,
nil
,
temp
,
i
)
return
dbp
.
arch
.
HardwareBreak
P
oints
()[
i
],
nil
dbp
.
arch
.
HardwareBreak
p
oints
()[
i
]
=
dbp
.
newHardwareBreakpoint
(
fn
.
Name
,
f
,
l
,
addr
,
nil
,
temp
,
i
)
return
dbp
.
arch
.
HardwareBreak
p
oints
()[
i
],
nil
}
}
// Fall back to software breakpoint. 0xCC is INT 3 trap interrupt.
...
...
@@ -138,23 +138,23 @@ func (dbp *DebuggedProcess) setBreakpoint(tid int, addr uint64, temp bool) (*Bre
if
_
,
err
:=
writeMemory
(
thread
,
uintptr
(
addr
),
dbp
.
arch
.
BreakpointInstruction
());
err
!=
nil
{
return
nil
,
err
}
dbp
.
Break
P
oints
[
addr
]
=
dbp
.
newBreakpoint
(
fn
.
Name
,
f
,
l
,
addr
,
originalData
,
temp
)
return
dbp
.
Break
P
oints
[
addr
],
nil
dbp
.
Break
p
oints
[
addr
]
=
dbp
.
newBreakpoint
(
fn
.
Name
,
f
,
l
,
addr
,
originalData
,
temp
)
return
dbp
.
Break
p
oints
[
addr
],
nil
}
// Error thrown when trying to clear a breakpoint that does not exist.
type
NoBreak
P
ointError
struct
{
type
NoBreak
p
ointError
struct
{
addr
uint64
}
func
(
nbp
NoBreak
P
ointError
)
Error
()
string
{
func
(
nbp
NoBreak
p
ointError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"no breakpoint at %#v"
,
nbp
.
addr
)
}
func
(
dbp
*
DebuggedProcess
)
clearBreakpoint
(
tid
int
,
addr
uint64
)
(
*
Break
P
oint
,
error
)
{
func
(
dbp
*
DebuggedProcess
)
clearBreakpoint
(
tid
int
,
addr
uint64
)
(
*
Break
p
oint
,
error
)
{
thread
:=
dbp
.
Threads
[
tid
]
// Check for hardware breakpoint
for
i
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
P
oints
()
{
for
i
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
p
oints
()
{
if
bp
==
nil
{
continue
}
...
...
@@ -163,17 +163,17 @@ func (dbp *DebuggedProcess) clearBreakpoint(tid int, addr uint64) (*BreakPoint,
if
err
!=
nil
{
return
nil
,
err
}
dbp
.
arch
.
HardwareBreak
P
oints
()[
i
]
=
nil
dbp
.
arch
.
HardwareBreak
p
oints
()[
i
]
=
nil
return
bp
,
nil
}
}
// Check for software breakpoint
if
bp
,
ok
:=
dbp
.
Break
P
oints
[
addr
];
ok
{
if
bp
,
ok
:=
dbp
.
Break
p
oints
[
addr
];
ok
{
if
_
,
err
:=
bp
.
Clear
(
thread
);
err
!=
nil
{
return
nil
,
err
}
delete
(
dbp
.
Break
P
oints
,
addr
)
delete
(
dbp
.
Break
p
oints
,
addr
)
return
bp
,
nil
}
return
nil
,
NoBreak
P
ointError
{
addr
:
addr
}
return
nil
,
NoBreak
p
ointError
{
addr
:
addr
}
}
proctl/proctl.go
浏览文件 @
a71f218e
...
...
@@ -27,7 +27,7 @@ type DebuggedProcess struct {
Process
*
os
.
Process
// Pointer to process struct for the actual process we are debugging
// Software breakpoint table. Hardware breakpoints are stored in proctl/arch.go, as they are architecture dependant.
Break
Points
map
[
uint64
]
*
BreakP
oint
Break
points
map
[
uint64
]
*
Breakp
oint
// List of threads mapped as such: pid -> *ThreadContext
Threads
map
[
int
]
*
ThreadContext
...
...
@@ -75,7 +75,7 @@ func Attach(pid int) (*DebuggedProcess, error) {
dbp
:=
&
DebuggedProcess
{
Pid
:
pid
,
Threads
:
make
(
map
[
int
]
*
ThreadContext
),
Break
Points
:
make
(
map
[
uint64
]
*
BreakP
oint
),
Break
points
:
make
(
map
[
uint64
]
*
Breakp
oint
),
os
:
new
(
OSProcessDetails
),
ast
:
source
.
New
(),
}
...
...
@@ -160,7 +160,7 @@ func (dbp *DebuggedProcess) FindLocation(str string) (uint64, error) {
}
// Use as breakpoint id
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
P
oints
()
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
p
oints
()
{
if
bp
==
nil
{
continue
}
...
...
@@ -168,7 +168,7 @@ func (dbp *DebuggedProcess) FindLocation(str string) (uint64, error) {
return
bp
.
Addr
,
nil
}
}
for
_
,
bp
:=
range
dbp
.
Break
P
oints
{
for
_
,
bp
:=
range
dbp
.
Break
p
oints
{
if
uint64
(
bp
.
ID
)
==
id
{
return
bp
.
Addr
,
nil
}
...
...
@@ -203,17 +203,17 @@ func (dbp *DebuggedProcess) RequestManualStop() error {
// hardware supports it, and there are free debug registers, Delve
// will set a hardware breakpoint. Otherwise we fall back to software
// breakpoints, which are a bit more work for us.
func
(
dbp
*
DebuggedProcess
)
Break
(
addr
uint64
)
(
*
Break
P
oint
,
error
)
{
func
(
dbp
*
DebuggedProcess
)
Break
(
addr
uint64
)
(
*
Break
p
oint
,
error
)
{
return
dbp
.
setBreakpoint
(
dbp
.
CurrentThread
.
Id
,
addr
,
false
)
}
// Sets a temp breakpoint, for the 'next' command.
func
(
dbp
*
DebuggedProcess
)
TempBreak
(
addr
uint64
)
(
*
Break
P
oint
,
error
)
{
func
(
dbp
*
DebuggedProcess
)
TempBreak
(
addr
uint64
)
(
*
Break
p
oint
,
error
)
{
return
dbp
.
setBreakpoint
(
dbp
.
CurrentThread
.
Id
,
addr
,
true
)
}
// Sets a breakpoint by location string (function, file+line, address)
func
(
dbp
*
DebuggedProcess
)
BreakByLocation
(
loc
string
)
(
*
Break
P
oint
,
error
)
{
func
(
dbp
*
DebuggedProcess
)
BreakByLocation
(
loc
string
)
(
*
Break
p
oint
,
error
)
{
addr
,
err
:=
dbp
.
FindLocation
(
loc
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -221,17 +221,17 @@ func (dbp *DebuggedProcess) BreakByLocation(loc string) (*BreakPoint, error) {
return
dbp
.
Break
(
addr
)
}
func
(
dbp
*
DebuggedProcess
)
HardwareBreak
Points
()
[]
*
BreakP
oint
{
return
dbp
.
arch
.
HardwareBreak
P
oints
()
func
(
dbp
*
DebuggedProcess
)
HardwareBreak
points
()
[]
*
Breakp
oint
{
return
dbp
.
arch
.
HardwareBreak
p
oints
()
}
// Clears a breakpoint in the current thread.
func
(
dbp
*
DebuggedProcess
)
Clear
(
addr
uint64
)
(
*
Break
P
oint
,
error
)
{
func
(
dbp
*
DebuggedProcess
)
Clear
(
addr
uint64
)
(
*
Break
p
oint
,
error
)
{
return
dbp
.
clearBreakpoint
(
dbp
.
CurrentThread
.
Id
,
addr
)
}
// Clears a breakpoint by location (function, file+line, address, breakpoint id)
func
(
dbp
*
DebuggedProcess
)
ClearByLocation
(
loc
string
)
(
*
Break
P
oint
,
error
)
{
func
(
dbp
*
DebuggedProcess
)
ClearByLocation
(
loc
string
)
(
*
Break
p
oint
,
error
)
{
addr
,
err
:=
dbp
.
FindLocation
(
loc
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -468,7 +468,7 @@ func (dbp *DebuggedProcess) PC() (uint64, error) {
}
// Returns the PC of the current thread.
func
(
dbp
*
DebuggedProcess
)
CurrentBreakpoint
()
*
Break
P
oint
{
func
(
dbp
*
DebuggedProcess
)
CurrentBreakpoint
()
*
Break
p
oint
{
return
dbp
.
CurrentThread
.
CurrentBreakpoint
}
...
...
@@ -498,13 +498,13 @@ func (dbp *DebuggedProcess) PCToLine(pc uint64) (string, int, *gosym.Func) {
}
// Finds the breakpoint for the given pc.
func
(
dbp
*
DebuggedProcess
)
FindBreakpoint
(
pc
uint64
)
(
*
Break
P
oint
,
bool
)
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
P
oints
()
{
func
(
dbp
*
DebuggedProcess
)
FindBreakpoint
(
pc
uint64
)
(
*
Break
p
oint
,
bool
)
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
p
oints
()
{
if
bp
!=
nil
&&
bp
.
Addr
==
pc
{
return
bp
,
true
}
}
if
bp
,
ok
:=
dbp
.
Break
P
oints
[
pc
];
ok
{
if
bp
,
ok
:=
dbp
.
Break
p
oints
[
pc
];
ok
{
return
bp
,
true
}
return
nil
,
false
...
...
@@ -547,14 +547,14 @@ func initializeDebugProcess(dbp *DebuggedProcess, path string, attach bool) (*De
}
func
(
dbp
*
DebuggedProcess
)
clearTempBreakpoints
()
error
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
P
oints
()
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
p
oints
()
{
if
bp
!=
nil
&&
bp
.
Temp
{
if
_
,
err
:=
dbp
.
Clear
(
bp
.
Addr
);
err
!=
nil
{
return
err
}
}
}
for
_
,
bp
:=
range
dbp
.
Break
P
oints
{
for
_
,
bp
:=
range
dbp
.
Break
p
oints
{
if
!
bp
.
Temp
{
continue
}
...
...
@@ -575,14 +575,14 @@ func (dbp *DebuggedProcess) handleBreakpointOnThread(id int) (*ThreadContext, er
return
nil
,
err
}
// Check for hardware breakpoint
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
P
oints
()
{
for
_
,
bp
:=
range
dbp
.
arch
.
HardwareBreak
p
oints
()
{
if
bp
!=
nil
&&
bp
.
Addr
==
pc
{
thread
.
CurrentBreakpoint
=
bp
return
thread
,
nil
}
}
// Check to see if we have hit a software breakpoint.
if
bp
,
ok
:=
dbp
.
Break
P
oints
[
pc
-
1
];
ok
{
if
bp
,
ok
:=
dbp
.
Break
p
oints
[
pc
-
1
];
ok
{
thread
.
CurrentBreakpoint
=
bp
if
err
=
thread
.
SetPC
(
bp
.
Addr
);
err
!=
nil
{
return
nil
,
err
...
...
@@ -603,7 +603,7 @@ func (dbp *DebuggedProcess) handleBreakpointOnThread(id int) (*ThreadContext, er
}
return
thread
,
nil
}
return
nil
,
NoBreak
P
ointError
{
addr
:
pc
}
return
nil
,
NoBreak
p
ointError
{
addr
:
pc
}
}
func
(
dbp
*
DebuggedProcess
)
run
(
fn
func
()
error
)
error
{
...
...
proctl/proctl_darwin.go
浏览文件 @
a71f218e
...
...
@@ -46,7 +46,7 @@ func Launch(cmd []string) (*DebuggedProcess, error) {
dbp
:=
&
DebuggedProcess
{
Threads
:
make
(
map
[
int
]
*
ThreadContext
),
Break
Points
:
make
(
map
[
uint64
]
*
BreakP
oint
),
Break
points
:
make
(
map
[
uint64
]
*
Breakp
oint
),
firstStart
:
true
,
os
:
new
(
OSProcessDetails
),
ast
:
source
.
New
(),
...
...
@@ -249,7 +249,7 @@ func (dbp *DebuggedProcess) trapWait(pid int) (*ThreadContext, error) {
dbp
.
updateThreadList
()
th
,
err
=
dbp
.
handleBreakpointOnThread
(
int
(
port
))
if
err
!=
nil
{
if
_
,
ok
:=
err
.
(
NoBreak
P
ointError
);
ok
{
if
_
,
ok
:=
err
.
(
NoBreak
p
ointError
);
ok
{
th
:=
dbp
.
Threads
[
int
(
port
)]
if
dbp
.
firstStart
||
dbp
.
singleStepping
||
th
.
singleStepping
{
dbp
.
firstStart
=
false
...
...
proctl/proctl_linux.go
浏览文件 @
a71f218e
...
...
@@ -47,7 +47,7 @@ func Launch(cmd []string) (*DebuggedProcess, error) {
dbp
:=
&
DebuggedProcess
{
Pid
:
proc
.
Process
.
Pid
,
Threads
:
make
(
map
[
int
]
*
ThreadContext
),
Break
Points
:
make
(
map
[
uint64
]
*
BreakP
oint
),
Break
points
:
make
(
map
[
uint64
]
*
Breakp
oint
),
os
:
new
(
OSProcessDetails
),
ast
:
source
.
New
(),
}
...
...
@@ -252,7 +252,7 @@ func (dbp *DebuggedProcess) trapWait(pid int) (*ThreadContext, error) {
if
err
!=
nil
{
return
nil
,
err
}
for
reg
,
bp
:=
range
dbp
.
HardwareBreak
P
oints
()
{
for
reg
,
bp
:=
range
dbp
.
HardwareBreak
p
oints
()
{
if
bp
==
nil
{
continue
}
...
...
proctl/proctl_test.go
浏览文件 @
a71f218e
...
...
@@ -138,7 +138,7 @@ func TestStep(t *testing.T) {
})
}
func
TestBreak
P
oint
(
t
*
testing
.
T
)
{
func
TestBreak
p
oint
(
t
*
testing
.
T
)
{
withTestProcess
(
"testprog"
,
t
,
func
(
p
*
DebuggedProcess
,
fixture
protest
.
Fixture
)
{
helloworldfunc
:=
p
.
goSymTable
.
LookupFunc
(
"main.helloworld"
)
helloworldaddr
:=
helloworldfunc
.
Entry
...
...
@@ -159,7 +159,7 @@ func TestBreakPoint(t *testing.T) {
})
}
func
TestBreak
P
ointInSeperateGoRoutine
(
t
*
testing
.
T
)
{
func
TestBreak
p
ointInSeperateGoRoutine
(
t
*
testing
.
T
)
{
withTestProcess
(
"testthreads"
,
t
,
func
(
p
*
DebuggedProcess
,
fixture
protest
.
Fixture
)
{
fn
:=
p
.
goSymTable
.
LookupFunc
(
"main.anotherthread"
)
if
fn
==
nil
{
...
...
@@ -188,7 +188,7 @@ func TestBreakPointInSeperateGoRoutine(t *testing.T) {
})
}
func
TestBreak
P
ointWithNonExistantFunction
(
t
*
testing
.
T
)
{
func
TestBreak
p
ointWithNonExistantFunction
(
t
*
testing
.
T
)
{
withTestProcess
(
"testprog"
,
t
,
func
(
p
*
DebuggedProcess
,
fixture
protest
.
Fixture
)
{
_
,
err
:=
p
.
Break
(
0
)
if
err
==
nil
{
...
...
@@ -197,7 +197,7 @@ func TestBreakPointWithNonExistantFunction(t *testing.T) {
})
}
func
TestClearBreak
P
oint
(
t
*
testing
.
T
)
{
func
TestClearBreak
p
oint
(
t
*
testing
.
T
)
{
withTestProcess
(
"testprog"
,
t
,
func
(
p
*
DebuggedProcess
,
fixture
protest
.
Fixture
)
{
fn
:=
p
.
goSymTable
.
LookupFunc
(
"main.sleepytime"
)
bp
,
err
:=
p
.
Break
(
fn
.
Entry
)
...
...
@@ -216,7 +216,7 @@ func TestClearBreakPoint(t *testing.T) {
t
.
Fatalf
(
"Breakpoint was not cleared data: %#v, int3: %#v"
,
data
,
int3
)
}
if
len
(
p
.
Break
P
oints
)
!=
0
{
if
len
(
p
.
Break
p
oints
)
!=
0
{
t
.
Fatal
(
"Breakpoint not removed internally"
)
}
})
...
...
@@ -248,10 +248,10 @@ func testnext(program string, testcases []nextTest, initialLocation string, t *t
}
}
if
len
(
p
.
Break
P
oints
)
!=
0
{
t
.
Fatal
(
"Not all breakpoints were cleaned up"
,
len
(
p
.
Break
P
oints
))
if
len
(
p
.
Break
p
oints
)
!=
0
{
t
.
Fatal
(
"Not all breakpoints were cleaned up"
,
len
(
p
.
Break
p
oints
))
}
for
_
,
bp
:=
range
p
.
arch
.
HardwareBreak
P
oints
()
{
for
_
,
bp
:=
range
p
.
arch
.
HardwareBreak
p
oints
()
{
if
bp
!=
nil
{
t
.
Fatal
(
"Not all breakpoints were cleaned up"
,
bp
.
Addr
)
}
...
...
proctl/threads.go
浏览文件 @
a71f218e
...
...
@@ -18,7 +18,7 @@ import (
type
ThreadContext
struct
{
Id
int
Status
*
sys
.
WaitStatus
CurrentBreakpoint
*
Break
P
oint
CurrentBreakpoint
*
Break
p
oint
dbp
*
DebuggedProcess
singleStepping
bool
running
bool
...
...
@@ -44,7 +44,7 @@ func (thread *ThreadContext) Continue() error {
// Check whether we are stopped at a breakpoint, and
// if so, single step over it before continuing.
if
_
,
ok
:=
thread
.
dbp
.
Break
P
oints
[
pc
];
ok
{
if
_
,
ok
:=
thread
.
dbp
.
Break
p
oints
[
pc
];
ok
{
if
err
:=
thread
.
Step
();
err
!=
nil
{
return
err
}
...
...
@@ -62,7 +62,7 @@ func (thread *ThreadContext) Step() (err error) {
return
err
}
bp
,
ok
:=
thread
.
dbp
.
Break
P
oints
[
pc
]
bp
,
ok
:=
thread
.
dbp
.
Break
p
oints
[
pc
]
if
ok
{
// Clear the breakpoint so that we can continue execution.
_
,
err
=
thread
.
dbp
.
Clear
(
bp
.
Addr
)
...
...
@@ -72,7 +72,7 @@ func (thread *ThreadContext) Step() (err error) {
// Restore breakpoint now that we have passed it.
defer
func
()
{
var
nbp
*
Break
P
oint
var
nbp
*
Break
p
oint
nbp
,
err
=
thread
.
dbp
.
Break
(
bp
.
Addr
)
nbp
.
Temp
=
bp
.
Temp
}()
...
...
@@ -86,17 +86,17 @@ func (thread *ThreadContext) Step() (err error) {
}
// Set breakpoint using this thread.
func
(
thread
*
ThreadContext
)
Break
(
addr
uint64
)
(
*
Break
P
oint
,
error
)
{
func
(
thread
*
ThreadContext
)
Break
(
addr
uint64
)
(
*
Break
p
oint
,
error
)
{
return
thread
.
dbp
.
setBreakpoint
(
thread
.
Id
,
addr
,
false
)
}
// Set breakpoint using this thread.
func
(
thread
*
ThreadContext
)
TempBreak
(
addr
uint64
)
(
*
Break
P
oint
,
error
)
{
func
(
thread
*
ThreadContext
)
TempBreak
(
addr
uint64
)
(
*
Break
p
oint
,
error
)
{
return
thread
.
dbp
.
setBreakpoint
(
thread
.
Id
,
addr
,
true
)
}
// Clear breakpoint using this thread.
func
(
thread
*
ThreadContext
)
Clear
(
addr
uint64
)
(
*
Break
P
oint
,
error
)
{
func
(
thread
*
ThreadContext
)
Clear
(
addr
uint64
)
(
*
Break
p
oint
,
error
)
{
return
thread
.
dbp
.
clearBreakpoint
(
thread
.
Id
,
addr
)
}
...
...
@@ -217,7 +217,7 @@ func (thread *ThreadContext) setNextTempBreakpoints(curpc uint64, pcs []uint64)
continue
}
if
_
,
err
:=
thread
.
dbp
.
TempBreak
(
pcs
[
i
]);
err
!=
nil
{
if
_
,
ok
:=
err
.
(
Break
P
ointExistsError
);
!
ok
{
if
_
,
ok
:=
err
.
(
Break
p
ointExistsError
);
!
ok
{
return
err
}
}
...
...
service/api/types.go
浏览文件 @
a71f218e
...
...
@@ -2,18 +2,18 @@ package api
// DebuggerState represents the current context of the debugger.
type
DebuggerState
struct
{
// Break
P
oint is the current breakpoint at which the debugged process is
// Break
p
oint is the current breakpoint at which the debugged process is
// suspended, and may be empty if the process is not suspended.
Break
Point
*
BreakP
oint
`json:"breakPoint,omitempty"`
Break
point
*
Breakp
oint
`json:"breakPoint,omitempty"`
// CurrentThread is the currently selected debugger thread.
CurrentThread
*
Thread
`json:"currentThread,omitempty"`
// Exited indicates whether the debugged process has exited.
Exited
bool
`json:"exited"`
}
// Break
P
oint addresses a location at which process execution may be
// Break
p
oint addresses a location at which process execution may be
// suspended.
type
Break
P
oint
struct
{
type
Break
p
oint
struct
{
// ID is a unique identifier for the breakpoint.
ID
int
`json:"id"`
// Addr is the address of the breakpoint.
...
...
service/client.go
浏览文件 @
a71f218e
...
...
@@ -24,14 +24,14 @@ type Client interface {
// Halt suspends the process.
Halt
()
(
*
api
.
DebuggerState
,
error
)
// GetBreak
P
oint gets a breakpoint by ID.
GetBreak
Point
(
id
int
)
(
*
api
.
BreakP
oint
,
error
)
// CreateBreak
P
oint creates a new breakpoint.
CreateBreak
Point
(
*
api
.
BreakPoint
)
(
*
api
.
BreakP
oint
,
error
)
// ListBreak
P
oints gets all breakpoints.
ListBreak
Points
()
([]
*
api
.
BreakP
oint
,
error
)
// ClearBreak
P
oint deletes a breakpoint by ID.
ClearBreak
Point
(
id
int
)
(
*
api
.
BreakP
oint
,
error
)
// GetBreak
p
oint gets a breakpoint by ID.
GetBreak
point
(
id
int
)
(
*
api
.
Breakp
oint
,
error
)
// CreateBreak
p
oint creates a new breakpoint.
CreateBreak
point
(
*
api
.
Breakpoint
)
(
*
api
.
Breakp
oint
,
error
)
// ListBreak
p
oints gets all breakpoints.
ListBreak
points
()
([]
*
api
.
Breakp
oint
,
error
)
// ClearBreak
p
oint deletes a breakpoint by ID.
ClearBreak
point
(
id
int
)
(
*
api
.
Breakp
oint
,
error
)
// ListThreads lists all threads.
ListThreads
()
([]
*
api
.
Thread
,
error
)
...
...
service/debugger/debugger.go
浏览文件 @
a71f218e
...
...
@@ -113,13 +113,13 @@ func (d *Debugger) Run() error {
log
.
Print
(
"debugger is stopping"
)
// Clear breakpoints
bps
:=
[]
*
proc
tl
.
BreakP
oint
{}
for
_
,
bp
:=
range
d
.
process
.
Break
P
oints
{
bps
:=
[]
*
proc
.
Breakp
oint
{}
for
_
,
bp
:=
range
d
.
process
.
Break
p
oints
{
if
bp
!=
nil
{
bps
=
append
(
bps
,
bp
)
}
}
for
_
,
bp
:=
range
d
.
process
.
HardwareBreak
P
oints
()
{
for
_
,
bp
:=
range
d
.
process
.
HardwareBreak
p
oints
()
{
if
bp
!=
nil
{
bps
=
append
(
bps
,
bp
)
}
...
...
@@ -176,14 +176,14 @@ func (d *Debugger) State() (*api.DebuggerState, error) {
thread
=
convertThread
(
th
)
}
var
breakpoint
*
api
.
Break
P
oint
var
breakpoint
*
api
.
Break
p
oint
bp
:=
p
.
CurrentBreakpoint
()
if
bp
!=
nil
{
breakpoint
=
convertBreak
P
oint
(
bp
)
breakpoint
=
convertBreak
p
oint
(
bp
)
}
state
=
&
api
.
DebuggerState
{
Break
P
oint
:
breakpoint
,
Break
p
oint
:
breakpoint
,
CurrentThread
:
thread
,
Exited
:
p
.
Exited
(),
}
...
...
@@ -193,9 +193,9 @@ func (d *Debugger) State() (*api.DebuggerState, error) {
return
state
,
err
}
func
(
d
*
Debugger
)
CreateBreakPoint
(
requestedBp
*
api
.
BreakPoint
)
(
*
api
.
BreakPoint
,
error
)
{
var
createdBp
*
api
.
BreakPoint
err
:=
d
.
withProcess
(
func
(
p
*
proctl
.
DebuggedProcess
)
error
{
func
(
d
*
Debugger
)
CreateBreakpoint
(
requestedBp
*
api
.
Breakpoint
)
(
*
api
.
Breakpoint
,
error
)
{
var
createdBp
*
api
.
Breakpoint
var
loc
string
switch
{
case
len
(
requestedBp
.
File
)
>
0
:
...
...
@@ -210,50 +210,50 @@ func (d *Debugger) CreateBreakPoint(requestedBp *api.BreakPoint) (*api.BreakPoin
if
breakError
!=
nil
{
return
breakError
}
createdBp
=
convertBreak
P
oint
(
bp
)
createdBp
=
convertBreak
p
oint
(
bp
)
log
.
Printf
(
"created breakpoint: %#v"
,
createdBp
)
return
nil
})
return
createdBp
,
err
}
func
(
d
*
Debugger
)
ClearBreak
Point
(
requestedBp
*
api
.
BreakPoint
)
(
*
api
.
BreakP
oint
,
error
)
{
var
clearedBp
*
api
.
Break
P
oint
err
:=
d
.
withProcess
(
func
(
p
*
proc
tl
.
DebuggedProcess
)
error
{
func
(
d
*
Debugger
)
ClearBreak
point
(
requestedBp
*
api
.
Breakpoint
)
(
*
api
.
Breakp
oint
,
error
)
{
var
clearedBp
*
api
.
Break
p
oint
err
:=
d
.
withProcess
(
func
(
p
*
proc
.
DebuggedProcess
)
error
{
bp
,
err
:=
p
.
Clear
(
requestedBp
.
Addr
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"Can't clear breakpoint @%x: %s"
,
requestedBp
.
Addr
,
err
)
}
clearedBp
=
convertBreak
P
oint
(
bp
)
clearedBp
=
convertBreak
p
oint
(
bp
)
log
.
Printf
(
"cleared breakpoint: %#v"
,
clearedBp
)
return
nil
})
return
clearedBp
,
err
}
func
(
d
*
Debugger
)
Break
Points
()
[]
*
api
.
BreakP
oint
{
bps
:=
[]
*
api
.
Break
P
oint
{}
d
.
withProcess
(
func
(
p
*
proc
tl
.
DebuggedProcess
)
error
{
for
_
,
bp
:=
range
p
.
HardwareBreak
P
oints
()
{
func
(
d
*
Debugger
)
Break
points
()
[]
*
api
.
Breakp
oint
{
bps
:=
[]
*
api
.
Break
p
oint
{}
d
.
withProcess
(
func
(
p
*
proc
.
DebuggedProcess
)
error
{
for
_
,
bp
:=
range
p
.
HardwareBreak
p
oints
()
{
if
bp
==
nil
{
continue
}
bps
=
append
(
bps
,
convertBreak
P
oint
(
bp
))
bps
=
append
(
bps
,
convertBreak
p
oint
(
bp
))
}
for
_
,
bp
:=
range
p
.
Break
P
oints
{
for
_
,
bp
:=
range
p
.
Break
p
oints
{
if
bp
.
Temp
{
continue
}
bps
=
append
(
bps
,
convertBreak
P
oint
(
bp
))
bps
=
append
(
bps
,
convertBreak
p
oint
(
bp
))
}
return
nil
})
return
bps
}
func
(
d
*
Debugger
)
FindBreak
Point
(
id
int
)
*
api
.
BreakP
oint
{
for
_
,
bp
:=
range
d
.
Break
P
oints
()
{
func
(
d
*
Debugger
)
FindBreak
point
(
id
int
)
*
api
.
Breakp
oint
{
for
_
,
bp
:=
range
d
.
Break
p
oints
()
{
if
bp
.
ID
==
id
{
return
bp
}
...
...
@@ -459,9 +459,9 @@ func (d *Debugger) Goroutines() ([]*api.Goroutine, error) {
return
goroutines
,
err
}
// convertBreak
Point converts an internal breakpoint to an API BreakP
oint.
func
convertBreak
Point
(
bp
*
proctl
.
BreakPoint
)
*
api
.
BreakP
oint
{
return
&
api
.
Break
P
oint
{
// convertBreak
point converts an internal breakpoint to an API Breakp
oint.
func
convertBreak
point
(
bp
*
proctl
.
Breakpoint
)
*
api
.
Breakp
oint
{
return
&
api
.
Break
p
oint
{
ID
:
bp
.
ID
,
FunctionName
:
bp
.
FunctionName
,
File
:
bp
.
File
,
...
...
service/rest/client.go
浏览文件 @
a71f218e
...
...
@@ -106,8 +106,8 @@ func (c *RESTClient) Halt() (*api.DebuggerState, error) {
return
state
,
nil
}
func
(
c
*
RESTClient
)
GetBreak
Point
(
id
int
)
(
*
api
.
BreakP
oint
,
error
)
{
var
breakPoint
*
api
.
Break
P
oint
func
(
c
*
RESTClient
)
GetBreak
point
(
id
int
)
(
*
api
.
Breakp
oint
,
error
)
{
var
breakPoint
*
api
.
Break
p
oint
err
:=
c
.
doGET
(
fmt
.
Sprintf
(
"/breakpoints/%d"
,
id
),
&
breakPoint
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -115,17 +115,17 @@ func (c *RESTClient) GetBreakPoint(id int) (*api.BreakPoint, error) {
return
breakPoint
,
nil
}
func
(
c
*
RESTClient
)
CreateBreak
Point
(
breakPoint
*
api
.
BreakPoint
)
(
*
api
.
BreakP
oint
,
error
)
{
var
newBreak
Point
*
api
.
BreakP
oint
err
:=
c
.
doPOST
(
"/breakpoints"
,
breakPoint
,
&
newBreak
P
oint
)
func
(
c
*
RESTClient
)
CreateBreak
point
(
breakPoint
*
api
.
Breakpoint
)
(
*
api
.
Breakp
oint
,
error
)
{
var
newBreak
point
*
api
.
Breakp
oint
err
:=
c
.
doPOST
(
"/breakpoints"
,
breakPoint
,
&
newBreak
p
oint
)
if
err
!=
nil
{
return
nil
,
err
}
return
newBreak
P
oint
,
nil
return
newBreak
p
oint
,
nil
}
func
(
c
*
RESTClient
)
ListBreak
Points
()
([]
*
api
.
BreakP
oint
,
error
)
{
var
breakPoints
[]
*
api
.
Break
P
oint
func
(
c
*
RESTClient
)
ListBreak
points
()
([]
*
api
.
Breakp
oint
,
error
)
{
var
breakPoints
[]
*
api
.
Break
p
oint
err
:=
c
.
doGET
(
"/breakpoints"
,
&
breakPoints
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -133,8 +133,8 @@ func (c *RESTClient) ListBreakPoints() ([]*api.BreakPoint, error) {
return
breakPoints
,
nil
}
func
(
c
*
RESTClient
)
ClearBreak
Point
(
id
int
)
(
*
api
.
BreakP
oint
,
error
)
{
var
breakPoint
*
api
.
Break
P
oint
func
(
c
*
RESTClient
)
ClearBreak
point
(
id
int
)
(
*
api
.
Breakp
oint
,
error
)
{
var
breakPoint
*
api
.
Break
p
oint
err
:=
c
.
doDELETE
(
fmt
.
Sprintf
(
"/breakpoints/%d"
,
id
),
&
breakPoint
)
if
err
!=
nil
{
return
nil
,
err
...
...
service/rest/integration_test.go
浏览文件 @
a71f218e
...
...
@@ -53,7 +53,7 @@ func TestClientServer_exit(t *testing.T) {
func
TestClientServer_step
(
t
*
testing
.
T
)
{
withTestClient
(
"testprog"
,
t
,
func
(
c
service
.
Client
)
{
_
,
err
:=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
FunctionName
:
"main.helloworld"
})
_
,
err
:=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
FunctionName
:
"main.helloworld"
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -80,7 +80,7 @@ type nextTest struct {
func
testnext
(
testcases
[]
nextTest
,
initialLocation
string
,
t
*
testing
.
T
)
{
withTestClient
(
"testnextprog"
,
t
,
func
(
c
service
.
Client
)
{
bp
,
err
:=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
FunctionName
:
initialLocation
})
bp
,
err
:=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
FunctionName
:
initialLocation
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -90,7 +90,7 @@ func testnext(testcases []nextTest, initialLocation string, t *testing.T) {
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
_
,
err
=
c
.
ClearBreak
P
oint
(
bp
.
ID
)
_
,
err
=
c
.
ClearBreak
p
oint
(
bp
.
ID
)
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -152,7 +152,7 @@ func TestNextFunctionReturn(t *testing.T) {
func
TestClientServer_breakpointInMainThread
(
t
*
testing
.
T
)
{
withTestClient
(
"testprog"
,
t
,
func
(
c
service
.
Client
)
{
bp
,
err
:=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
FunctionName
:
"main.helloworld"
})
bp
,
err
:=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
FunctionName
:
"main.helloworld"
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -173,7 +173,7 @@ func TestClientServer_breakpointInMainThread(t *testing.T) {
func
TestClientServer_breakpointInSeparateGoroutine
(
t
*
testing
.
T
)
{
withTestClient
(
"testthreads"
,
t
,
func
(
c
service
.
Client
)
{
_
,
err
:=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
FunctionName
:
"main.anotherthread"
})
_
,
err
:=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
FunctionName
:
"main.anotherthread"
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -192,7 +192,7 @@ func TestClientServer_breakpointInSeparateGoroutine(t *testing.T) {
func
TestClientServer_breakAtNonexistentPoint
(
t
*
testing
.
T
)
{
withTestClient
(
"testprog"
,
t
,
func
(
c
service
.
Client
)
{
_
,
err
:=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
FunctionName
:
"nowhere"
})
_
,
err
:=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
FunctionName
:
"nowhere"
})
if
err
==
nil
{
t
.
Fatal
(
"Should not be able to break at non existent function"
)
}
...
...
@@ -201,17 +201,17 @@ func TestClientServer_breakAtNonexistentPoint(t *testing.T) {
func
TestClientServer_clearBreakpoint
(
t
*
testing
.
T
)
{
withTestClient
(
"testprog"
,
t
,
func
(
c
service
.
Client
)
{
bp
,
err
:=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
FunctionName
:
"main.sleepytime"
})
bp
,
err
:=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
FunctionName
:
"main.sleepytime"
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
bps
,
err
:=
c
.
ListBreak
P
oints
()
bps
,
err
:=
c
.
ListBreak
p
oints
()
if
e
,
a
:=
1
,
len
(
bps
);
e
!=
a
{
t
.
Fatalf
(
"Expected breakpoint count %d, got %d"
,
e
,
a
)
}
deleted
,
err
:=
c
.
ClearBreak
P
oint
(
bp
.
ID
)
deleted
,
err
:=
c
.
ClearBreak
p
oint
(
bp
.
ID
)
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -220,7 +220,7 @@ func TestClientServer_clearBreakpoint(t *testing.T) {
t
.
Fatalf
(
"Expected deleted breakpoint ID %v, got %v"
,
bp
.
ID
,
deleted
.
ID
)
}
bps
,
err
=
c
.
ListBreak
P
oints
()
bps
,
err
=
c
.
ListBreak
p
oints
()
if
e
,
a
:=
0
,
len
(
bps
);
e
!=
a
{
t
.
Fatalf
(
"Expected breakpoint count %d, got %d"
,
e
,
a
)
}
...
...
@@ -235,7 +235,7 @@ func TestClientServer_switchThread(t *testing.T) {
t
.
Fatal
(
"Expected error for invalid thread id"
)
}
_
,
err
=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
FunctionName
:
"main.main"
})
_
,
err
=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
FunctionName
:
"main.main"
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -276,7 +276,7 @@ func TestClientServer_infoLocals(t *testing.T) {
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
_
,
err
=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
File
:
fp
,
Line
:
23
})
_
,
err
=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
File
:
fp
,
Line
:
23
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
@@ -300,7 +300,7 @@ func TestClientServer_infoArgs(t *testing.T) {
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
_
,
err
=
c
.
CreateBreak
Point
(
&
api
.
BreakP
oint
{
File
:
fp
,
Line
:
47
})
_
,
err
=
c
.
CreateBreak
point
(
&
api
.
Breakp
oint
{
File
:
fp
,
Line
:
47
})
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
...
...
service/rest/server.go
浏览文件 @
a71f218e
...
...
@@ -81,10 +81,10 @@ func (s *RESTServer) Run() error {
Consumes
(
restful
.
MIME_JSON
)
.
Produces
(
restful
.
MIME_JSON
)
.
Route
(
ws
.
GET
(
"/state"
)
.
To
(
s
.
getState
))
.
Route
(
ws
.
GET
(
"/breakpoints"
)
.
To
(
s
.
listBreak
P
oints
))
.
Route
(
ws
.
GET
(
"/breakpoints/{breakpoint-id}"
)
.
To
(
s
.
getBreak
P
oint
))
.
Route
(
ws
.
POST
(
"/breakpoints"
)
.
To
(
s
.
createBreak
P
oint
))
.
Route
(
ws
.
DELETE
(
"/breakpoints/{breakpoint-id}"
)
.
To
(
s
.
clearBreak
P
oint
))
.
Route
(
ws
.
GET
(
"/breakpoints"
)
.
To
(
s
.
listBreak
p
oints
))
.
Route
(
ws
.
GET
(
"/breakpoints/{breakpoint-id}"
)
.
To
(
s
.
getBreak
p
oint
))
.
Route
(
ws
.
POST
(
"/breakpoints"
)
.
To
(
s
.
createBreak
p
oint
))
.
Route
(
ws
.
DELETE
(
"/breakpoints/{breakpoint-id}"
)
.
To
(
s
.
clearBreak
p
oint
))
.
Route
(
ws
.
GET
(
"/threads"
)
.
To
(
s
.
listThreads
))
.
Route
(
ws
.
GET
(
"/threads/{thread-id}"
)
.
To
(
s
.
getThread
))
.
Route
(
ws
.
GET
(
"/threads/{thread-id}/vars"
)
.
To
(
s
.
listThreadPackageVars
))
.
...
...
@@ -166,14 +166,14 @@ func (s *RESTServer) doCommand(request *restful.Request, response *restful.Respo
response
.
WriteEntity
(
state
)
}
func
(
s
*
RESTServer
)
getBreak
P
oint
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
func
(
s
*
RESTServer
)
getBreak
p
oint
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
id
,
err
:=
strconv
.
Atoi
(
request
.
PathParameter
(
"breakpoint-id"
))
if
err
!=
nil
{
writeError
(
response
,
http
.
StatusBadRequest
,
"invalid breakpoint id"
)
return
}
found
:=
s
.
debugger
.
FindBreak
P
oint
(
id
)
found
:=
s
.
debugger
.
FindBreak
p
oint
(
id
)
if
found
==
nil
{
writeError
(
response
,
http
.
StatusNotFound
,
"breakpoint not found"
)
return
...
...
@@ -182,12 +182,12 @@ func (s *RESTServer) getBreakPoint(request *restful.Request, response *restful.R
response
.
WriteEntity
(
found
)
}
func
(
s
*
RESTServer
)
listBreak
P
oints
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
response
.
WriteEntity
(
s
.
debugger
.
Break
P
oints
())
func
(
s
*
RESTServer
)
listBreak
p
oints
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
response
.
WriteEntity
(
s
.
debugger
.
Break
p
oints
())
}
func
(
s
*
RESTServer
)
createBreak
P
oint
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
incomingBp
:=
new
(
api
.
Break
P
oint
)
func
(
s
*
RESTServer
)
createBreak
p
oint
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
incomingBp
:=
new
(
api
.
Break
p
oint
)
err
:=
request
.
ReadEntity
(
incomingBp
)
if
err
!=
nil
{
writeError
(
response
,
http
.
StatusInternalServerError
,
err
.
Error
())
...
...
@@ -199,7 +199,7 @@ func (s *RESTServer) createBreakPoint(request *restful.Request, response *restfu
return
}
createdbp
,
err
:=
s
.
debugger
.
CreateBreak
P
oint
(
incomingBp
)
createdbp
,
err
:=
s
.
debugger
.
CreateBreak
p
oint
(
incomingBp
)
if
err
!=
nil
{
writeError
(
response
,
http
.
StatusInternalServerError
,
err
.
Error
())
...
...
@@ -210,20 +210,20 @@ func (s *RESTServer) createBreakPoint(request *restful.Request, response *restfu
response
.
WriteEntity
(
createdbp
)
}
func
(
s
*
RESTServer
)
clearBreak
P
oint
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
func
(
s
*
RESTServer
)
clearBreak
p
oint
(
request
*
restful
.
Request
,
response
*
restful
.
Response
)
{
id
,
err
:=
strconv
.
Atoi
(
request
.
PathParameter
(
"breakpoint-id"
))
if
err
!=
nil
{
writeError
(
response
,
http
.
StatusBadRequest
,
"invalid breakpoint id"
)
return
}
found
:=
s
.
debugger
.
FindBreak
P
oint
(
id
)
found
:=
s
.
debugger
.
FindBreak
p
oint
(
id
)
if
found
==
nil
{
writeError
(
response
,
http
.
StatusNotFound
,
"breakpoint not found"
)
return
}
deleted
,
err
:=
s
.
debugger
.
ClearBreak
P
oint
(
found
)
deleted
,
err
:=
s
.
debugger
.
ClearBreak
p
oint
(
found
)
if
err
!=
nil
{
writeError
(
response
,
http
.
StatusInternalServerError
,
err
.
Error
())
return
...
...
terminal/command.go
浏览文件 @
a71f218e
...
...
@@ -231,7 +231,7 @@ func clear(client service.Client, args ...string) error {
return
err
}
bp
,
err
:=
client
.
ClearBreak
P
oint
(
id
)
bp
,
err
:=
client
.
ClearBreak
p
oint
(
id
)
if
err
!=
nil
{
return
err
}
...
...
@@ -240,12 +240,12 @@ func clear(client service.Client, args ...string) error {
}
func
clearAll
(
client
service
.
Client
,
args
...
string
)
error
{
breakPoints
,
err
:=
client
.
ListBreak
P
oints
()
breakPoints
,
err
:=
client
.
ListBreak
p
oints
()
if
err
!=
nil
{
return
err
}
for
_
,
bp
:=
range
breakPoints
{
_
,
err
:=
client
.
ClearBreak
P
oint
(
bp
.
ID
)
_
,
err
:=
client
.
ClearBreak
p
oint
(
bp
.
ID
)
if
err
!=
nil
{
fmt
.
Printf
(
"Couldn't delete breakpoint %d at %#v %s:%d: %s
\n
"
,
bp
.
ID
,
bp
.
Addr
,
bp
.
File
,
bp
.
Line
,
err
)
}
...
...
@@ -254,14 +254,14 @@ func clearAll(client service.Client, args ...string) error {
return
nil
}
type
ById
[]
*
api
.
Break
P
oint
type
ById
[]
*
api
.
Break
p
oint
func
(
a
ById
)
Len
()
int
{
return
len
(
a
)
}
func
(
a
ById
)
Swap
(
i
,
j
int
)
{
a
[
i
],
a
[
j
]
=
a
[
j
],
a
[
i
]
}
func
(
a
ById
)
Less
(
i
,
j
int
)
bool
{
return
a
[
i
]
.
ID
<
a
[
j
]
.
ID
}
func
breakpoints
(
client
service
.
Client
,
args
...
string
)
error
{
breakPoints
,
err
:=
client
.
ListBreak
P
oints
()
breakPoints
,
err
:=
client
.
ListBreak
p
oints
()
if
err
!=
nil
{
return
err
}
...
...
@@ -277,7 +277,7 @@ func breakpoint(client service.Client, args ...string) error {
if
len
(
args
)
!=
1
{
return
fmt
.
Errorf
(
"argument must be either a function name or <file:line>"
)
}
requestedBp
:=
&
api
.
Break
P
oint
{}
requestedBp
:=
&
api
.
Break
p
oint
{}
tokens
:=
strings
.
Split
(
args
[
0
],
":"
)
switch
{
case
len
(
tokens
)
==
1
:
...
...
@@ -294,7 +294,7 @@ func breakpoint(client service.Client, args ...string) error {
return
fmt
.
Errorf
(
"invalid line reference"
)
}
bp
,
err
:=
client
.
CreateBreak
P
oint
(
requestedBp
)
bp
,
err
:=
client
.
CreateBreak
p
oint
(
requestedBp
)
if
err
!=
nil
{
return
err
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录