Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
4fbeb8df
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
4fbeb8df
编写于
2月 27, 2013
作者:
K
kevinw
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
7aaf2d3c
3d73d460
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
50 addition
and
1 deletion
+50
-1
agent/src/os/linux/LinuxDebuggerLocal.c
agent/src/os/linux/LinuxDebuggerLocal.c
+50
-1
未找到文件。
agent/src/os/linux/LinuxDebuggerLocal.c
浏览文件 @
4fbeb8df
/*
/*
* Copyright (c) 2002, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -25,6 +25,13 @@
...
@@ -25,6 +25,13 @@
#include <jni.h>
#include <jni.h>
#include "libproc.h"
#include "libproc.h"
#include <elf.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <limits.h>
#if defined(x86_64) && !defined(amd64)
#if defined(x86_64) && !defined(amd64)
#define amd64 1
#define amd64 1
#endif
#endif
...
@@ -154,6 +161,39 @@ static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_p
...
@@ -154,6 +161,39 @@ static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_p
}
}
}
}
/*
* Verify that a named ELF binary file (core or executable) has the same
* bitness as ourselves.
* Throw an exception if there is a mismatch or other problem.
*
* If we proceed using a mismatched debugger/debuggee, the best to hope
* for is a missing symbol, the worst is a crash searching for debug symbols.
*/
void
verifyBitness
(
JNIEnv
*
env
,
const
char
*
binaryName
)
{
int
fd
=
open
(
binaryName
,
O_RDONLY
);
if
(
fd
<
0
)
{
THROW_NEW_DEBUGGER_EXCEPTION
(
"cannot open binary file"
);
}
unsigned
char
elf_ident
[
EI_NIDENT
];
int
i
=
read
(
fd
,
&
elf_ident
,
sizeof
(
elf_ident
));
close
(
fd
);
if
(
i
<
0
)
{
THROW_NEW_DEBUGGER_EXCEPTION
(
"cannot read binary file"
);
}
#ifndef _LP64
if
(
elf_ident
[
EI_CLASS
]
==
ELFCLASS64
)
{
THROW_NEW_DEBUGGER_EXCEPTION
(
"debuggee is 64 bit, use 64-bit java for debugger"
);
}
#else
if
(
elf_ident
[
EI_CLASS
]
!=
ELFCLASS64
)
{
THROW_NEW_DEBUGGER_EXCEPTION
(
"debuggee is 32 bit, use 32 bit java for debugger"
);
}
#endif
}
/*
/*
* Class: sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
* Class: sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal
* Method: attach0
* Method: attach0
...
@@ -162,6 +202,12 @@ static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_p
...
@@ -162,6 +202,12 @@ static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_p
JNIEXPORT
void
JNICALL
Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_attach0__I
JNIEXPORT
void
JNICALL
Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_attach0__I
(
JNIEnv
*
env
,
jobject
this_obj
,
jint
jpid
)
{
(
JNIEnv
*
env
,
jobject
this_obj
,
jint
jpid
)
{
// For bitness checking, locate binary at /proc/jpid/exe
char
buf
[
PATH_MAX
];
snprintf
((
char
*
)
&
buf
,
PATH_MAX
,
"/proc/%d/exe"
,
jpid
);
verifyBitness
(
env
,
(
char
*
)
&
buf
);
CHECK_EXCEPTION
;
struct
ps_prochandle
*
ph
;
struct
ps_prochandle
*
ph
;
if
(
(
ph
=
Pgrab
(
jpid
))
==
NULL
)
{
if
(
(
ph
=
Pgrab
(
jpid
))
==
NULL
)
{
THROW_NEW_DEBUGGER_EXCEPTION
(
"Can't attach to the process"
);
THROW_NEW_DEBUGGER_EXCEPTION
(
"Can't attach to the process"
);
...
@@ -187,6 +233,9 @@ JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_at
...
@@ -187,6 +233,9 @@ JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_at
coreName_cstr
=
(
*
env
)
->
GetStringUTFChars
(
env
,
coreName
,
&
isCopy
);
coreName_cstr
=
(
*
env
)
->
GetStringUTFChars
(
env
,
coreName
,
&
isCopy
);
CHECK_EXCEPTION
;
CHECK_EXCEPTION
;
verifyBitness
(
env
,
execName_cstr
);
CHECK_EXCEPTION
;
if
(
(
ph
=
Pgrab_core
(
execName_cstr
,
coreName_cstr
))
==
NULL
)
{
if
(
(
ph
=
Pgrab_core
(
execName_cstr
,
coreName_cstr
))
==
NULL
)
{
(
*
env
)
->
ReleaseStringUTFChars
(
env
,
execName
,
execName_cstr
);
(
*
env
)
->
ReleaseStringUTFChars
(
env
,
execName
,
execName_cstr
);
(
*
env
)
->
ReleaseStringUTFChars
(
env
,
coreName
,
coreName_cstr
);
(
*
env
)
->
ReleaseStringUTFChars
(
env
,
coreName
,
coreName_cstr
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录