Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
pubx
delve
提交
636719a4
D
delve
项目概览
pubx
/
delve
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
delve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
636719a4
编写于
2月 28, 2015
作者:
D
Derek Parker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Handle thread_get_state errors
上级
77725b3d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
11 addition
and
11 deletion
+11
-11
proctl/registers_darwin_amd64.go
proctl/registers_darwin_amd64.go
+6
-1
proctl/threads_darwin.c
proctl/threads_darwin.c
+3
-8
proctl/threads_darwin.h
proctl/threads_darwin.h
+2
-2
未找到文件。
proctl/registers_darwin_amd64.go
浏览文件 @
636719a4
...
...
@@ -2,6 +2,7 @@ package proctl
// #include "threads_darwin.h"
import
"C"
import
"fmt"
type
Regs
struct
{
pc
,
sp
uint64
...
...
@@ -21,7 +22,11 @@ func (r *Regs) SetPC(thread *ThreadContext, pc uint64) error {
}
func
registers
(
thread
*
ThreadContext
)
(
Registers
,
error
)
{
state
:=
C
.
get_registers
(
C
.
mach_port_name_t
(
thread
.
os
.
thread_act
))
var
state
C
.
x86_thread_state64_t
kret
:=
C
.
get_registers
(
C
.
mach_port_name_t
(
thread
.
os
.
thread_act
),
&
state
)
if
kret
!=
C
.
KERN_SUCCESS
{
return
nil
,
fmt
.
Errorf
(
"could not get registers"
)
}
regs
:=
&
Regs
{
pc
:
uint64
(
state
.
__rip
),
sp
:
uint64
(
state
.
__rsp
)}
return
regs
,
nil
}
proctl/threads_darwin.c
浏览文件 @
636719a4
...
...
@@ -37,18 +37,13 @@ read_memory(mach_port_name_t task, mach_vm_address_t addr, void *d, mach_msg_typ
return
count
;
}
x86_thread_state64
_t
get_registers
(
mach_port_name_t
task
)
{
kern_return
_t
get_registers
(
mach_port_name_t
task
,
x86_thread_state64_t
*
state
)
{
kern_return_t
kret
;
x86_thread_state64_t
state
;
mach_msg_type_number_t
stateCount
=
x86_THREAD_STATE64_COUNT
;
// TODO(dp) - possible memory leak - vm_deallocate state
kret
=
thread_get_state
(
task
,
x86_THREAD_STATE64
,
(
thread_state_t
)
&
state
,
&
stateCount
);
if
(
kret
!=
KERN_SUCCESS
)
printf
(
"SOMETHING WENT WRONG-------------- %d
\n
"
,
kret
);
if
(
kret
==
KERN_INVALID_ARGUMENT
)
puts
(
"INAVLID ARGUMENT"
);
return
state
;
return
thread_get_state
(
task
,
x86_THREAD_STATE64
,
(
thread_state_t
)
state
,
&
stateCount
);
}
// TODO(dp) this should return kret instead of void
...
...
proctl/threads_darwin.h
浏览文件 @
636719a4
...
...
@@ -10,8 +10,8 @@ write_memory(mach_port_name_t, mach_vm_address_t, void *, mach_msg_type_number_t
int
read_memory
(
mach_port_name_t
,
mach_vm_address_t
,
void
*
,
mach_msg_type_number_t
);
x86_thread_state64
_t
get_registers
(
mach_port_name_t
);
kern_return
_t
get_registers
(
mach_port_name_t
,
x86_thread_state64_t
*
);
void
set_pc
(
thread_act_t
,
uint64_t
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录