Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
HugeYuan
delve
提交
f9340290
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,发现更多精彩内容 >>
提交
f9340290
编写于
6月 27, 2017
作者:
A
Alex Brainman
提交者:
Derek Parker
6月 26, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
proc/native: use os.StartProcess to implement windows Launch (#898)
上级
b47d6a09
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
10 addition
and
61 deletion
+10
-61
pkg/proc/native/proc_windows.go
pkg/proc/native/proc_windows.go
+10
-61
未找到文件。
pkg/proc/native/proc_windows.go
浏览文件 @
f9340290
...
...
@@ -56,75 +56,24 @@ func Launch(cmd []string, wd string) (*Process, error) {
}
closer
.
Close
()
// Duplicate the stdin/stdout/stderr handles
files
:=
[]
uintptr
{
uintptr
(
syscall
.
Stdin
),
uintptr
(
syscall
.
Stdout
),
uintptr
(
syscall
.
Stderr
)}
p
,
_
:=
syscall
.
GetCurrentProcess
()
fd
:=
make
([]
syscall
.
Handle
,
len
(
files
))
for
i
:=
range
files
{
err
:=
syscall
.
DuplicateHandle
(
p
,
syscall
.
Handle
(
files
[
i
]),
p
,
&
fd
[
i
],
0
,
true
,
syscall
.
DUPLICATE_SAME_ACCESS
)
if
err
!=
nil
{
return
nil
,
err
}
defer
syscall
.
CloseHandle
(
syscall
.
Handle
(
fd
[
i
]))
}
argv0
,
err
:=
syscall
.
UTF16PtrFromString
(
argv0Go
)
if
err
!=
nil
{
return
nil
,
err
}
// create suitable command line for CreateProcess
// see https://github.com/golang/go/blob/master/src/syscall/exec_windows.go#L326
// adapted from standard library makeCmdLine
// see https://github.com/golang/go/blob/master/src/syscall/exec_windows.go#L86
var
cmdLineGo
string
if
len
(
cmd
)
>=
1
{
for
_
,
v
:=
range
cmd
{
if
cmdLineGo
!=
""
{
cmdLineGo
+=
" "
}
cmdLineGo
+=
syscall
.
EscapeArg
(
v
)
}
}
var
cmdLine
*
uint16
if
cmdLineGo
!=
""
{
if
cmdLine
,
err
=
syscall
.
UTF16PtrFromString
(
cmdLineGo
);
err
!=
nil
{
return
nil
,
err
}
}
var
workingDir
*
uint16
if
wd
!=
""
{
if
workingDir
,
err
=
syscall
.
UTF16PtrFromString
(
wd
);
err
!=
nil
{
return
nil
,
err
}
}
// Initialize the startup info and create process
si
:=
new
(
sys
.
StartupInfo
)
si
.
Cb
=
uint32
(
unsafe
.
Sizeof
(
*
si
))
si
.
Flags
=
syscall
.
STARTF_USESTDHANDLES
si
.
StdInput
=
sys
.
Handle
(
fd
[
0
])
si
.
StdOutput
=
sys
.
Handle
(
fd
[
1
])
si
.
StdErr
=
sys
.
Handle
(
fd
[
2
])
pi
:=
new
(
sys
.
ProcessInformation
)
var
p
*
os
.
Process
dbp
:=
New
(
0
)
dbp
.
execPtraceFunc
(
func
()
{
if
wd
==
""
{
err
=
sys
.
CreateProcess
(
argv0
,
cmdLine
,
nil
,
nil
,
true
,
_DEBUG_ONLY_THIS_PROCESS
,
nil
,
nil
,
si
,
pi
)
}
else
{
err
=
sys
.
CreateProcess
(
argv0
,
cmdLine
,
nil
,
nil
,
true
,
_DEBUG_ONLY_THIS_PROCESS
,
nil
,
workingDir
,
si
,
pi
)
attr
:=
&
os
.
ProcAttr
{
Dir
:
wd
,
Files
:
[]
*
os
.
File
{
os
.
Stdin
,
os
.
Stdout
,
os
.
Stderr
},
Sys
:
&
syscall
.
SysProcAttr
{
CreationFlags
:
_DEBUG_ONLY_THIS_PROCESS
,
},
}
p
,
err
=
os
.
StartProcess
(
argv0Go
,
cmd
,
attr
)
})
if
err
!=
nil
{
return
nil
,
err
}
sys
.
CloseHandle
(
sys
.
Handle
(
pi
.
Process
))
sys
.
CloseHandle
(
sys
.
Handle
(
pi
.
Thread
))
defer
p
.
Release
()
dbp
.
pid
=
int
(
pi
.
ProcessId
)
dbp
.
pid
=
p
.
Pid
dbp
.
childProcess
=
true
return
newDebugProcess
(
dbp
,
argv0Go
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录