Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
0e6b9537
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看板
提交
0e6b9537
编写于
4月 15, 2012
作者:
D
dcubed
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
a3637474
0acc55f9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
30 addition
and
221 deletion
+30
-221
src/share/vm/runtime/thread.cpp
src/share/vm/runtime/thread.cpp
+3
-3
test/runtime/7158988/TestPostFieldModification.java
test/runtime/7158988/TestPostFieldModification.java
+27
-218
未找到文件。
src/share/vm/runtime/thread.cpp
浏览文件 @
0e6b9537
...
...
@@ -3468,13 +3468,13 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
create_vm_init_libraries
();
}
// Notify JVMTI agents that VM initialization is complete - nop if no agents.
JvmtiExport
::
post_vm_initialized
();
if
(
!
TRACE_START
())
{
vm_exit_during_initialization
(
Handle
(
THREAD
,
PENDING_EXCEPTION
));
}
// Notify JVMTI agents that VM initialization is complete - nop if no agents.
JvmtiExport
::
post_vm_initialized
();
if
(
CleanChunkPoolAsync
)
{
Chunk
::
start_chunk_pool_cleaner_task
();
}
...
...
test/runtime/7158988/TestPostFieldModification.java
浏览文件 @
0e6b9537
...
...
@@ -21,229 +21,38 @@
* questions.
*/
/*
* @test FieldMonitor.java
* @bug 7158988
* @summary verify jvm does not crash while debugging
* @run shell TestFieldMonitor.sh
* @author axel.siebenborn@sap.com
*/
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.io.OutputStream
;
import
java.io.OutputStreamWriter
;
import
java.io.Reader
;
import
java.io.Writer
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
com.sun.jdi.Bootstrap
;
import
com.sun.jdi.Field
;
import
com.sun.jdi.ReferenceType
;
import
com.sun.jdi.VirtualMachine
;
import
com.sun.jdi.connect.Connector
;
import
com.sun.jdi.connect.IllegalConnectorArgumentsException
;
import
com.sun.jdi.connect.LaunchingConnector
;
import
com.sun.jdi.connect.VMStartException
;
import
com.sun.jdi.event.ClassPrepareEvent
;
import
com.sun.jdi.event.Event
;
import
com.sun.jdi.event.EventQueue
;
import
com.sun.jdi.event.EventSet
;
import
com.sun.jdi.event.ModificationWatchpointEvent
;
import
com.sun.jdi.event.VMDeathEvent
;
import
com.sun.jdi.event.VMDisconnectEvent
;
import
com.sun.jdi.request.ClassPrepareRequest
;
import
com.sun.jdi.request.EventRequest
;
import
com.sun.jdi.request.EventRequestManager
;
import
com.sun.jdi.request.ModificationWatchpointRequest
;
public
class
FieldMonitor
{
public
static
final
String
CLASS_NAME
=
"TestPostFieldModification"
;
public
static
final
String
FIELD_NAME
=
"value"
;
public
static
final
String
ARGUMENTS
=
"-Xshare:off -XX:+PrintGC"
;
public
static
void
main
(
String
[]
args
)
throws
IOException
,
InterruptedException
{
StringBuffer
sb
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
args
.
length
;
i
++)
{
sb
.
append
(
' '
);
sb
.
append
(
args
[
i
]);
}
//VirtualMachine vm = launchTarget(sb.toString());
VirtualMachine
vm
=
launchTarget
(
CLASS_NAME
);
System
.
out
.
println
(
"Vm launched"
);
// set watch field on already loaded classes
List
<
ReferenceType
>
referenceTypes
=
vm
.
classesByName
(
CLASS_NAME
);
for
(
ReferenceType
refType
:
referenceTypes
)
{
addFieldWatch
(
vm
,
refType
);
}
// watch for loaded classes
addClassWatch
(
vm
);
// process events
EventQueue
eventQueue
=
vm
.
eventQueue
();
// resume the vm
public
class
TestPostFieldModification
{
Process
process
=
vm
.
process
();
public
String
value
;
// watch modification of value
public
static
void
main
(
String
[]
args
){
// Copy target's output and error to our output and error.
Thread
outThread
=
new
StreamRedirectThread
(
"out reader"
,
process
.
getInputStream
());
Thread
errThread
=
new
StreamRedirectThread
(
"error reader"
,
process
.
getErrorStream
());
errThread
.
start
();
outThread
.
start
();
vm
.
resume
();
boolean
connected
=
true
;
while
(
connected
)
{
EventSet
eventSet
=
eventQueue
.
remove
();
for
(
Event
event
:
eventSet
)
{
if
(
event
instanceof
VMDeathEvent
||
event
instanceof
VMDisconnectEvent
)
{
// exit
connected
=
false
;
}
else
if
(
event
instanceof
ClassPrepareEvent
)
{
// watch field on loaded class
System
.
out
.
println
(
"ClassPrepareEvent"
);
ClassPrepareEvent
classPrepEvent
=
(
ClassPrepareEvent
)
event
;
ReferenceType
refType
=
classPrepEvent
.
referenceType
();
addFieldWatch
(
vm
,
refType
);
}
else
if
(
event
instanceof
ModificationWatchpointEvent
)
{
System
.
out
.
println
(
"sleep for 500 ms"
);
Thread
.
sleep
(
500
);
System
.
out
.
println
(
"resume..."
);
ModificationWatchpointEvent
modEvent
=
(
ModificationWatchpointEvent
)
event
;
System
.
out
.
println
(
"old="
+
modEvent
.
valueCurrent
());
System
.
out
.
println
(
"new="
+
modEvent
.
valueToBe
());
System
.
out
.
println
();
System
.
out
.
println
(
"Start threads"
);
// this thread modifies the field 'value'
new
Thread
()
{
TestPostFieldModification
test
=
new
TestPostFieldModification
();
public
void
run
()
{
test
.
value
=
"test"
;
for
(
int
i
=
0
;
i
<
10
;
i
++)
{
test
.
value
+=
new
String
(
"_test"
);
}
}
eventSet
.
resume
();
}
// Shutdown begins when event thread terminates
try
{
errThread
.
join
();
// Make sure output is forwarded
outThread
.
join
();
}
catch
(
InterruptedException
exc
)
{
// we don't interrupt
}
}
/**
* Find a com.sun.jdi.CommandLineLaunch connector
*/
static
LaunchingConnector
findLaunchingConnector
()
{
List
<
Connector
>
connectors
=
Bootstrap
.
virtualMachineManager
().
allConnectors
();
Iterator
<
Connector
>
iter
=
connectors
.
iterator
();
while
(
iter
.
hasNext
())
{
Connector
connector
=
iter
.
next
();
if
(
connector
.
name
().
equals
(
"com.sun.jdi.CommandLineLaunch"
))
{
return
(
LaunchingConnector
)
connector
;
}
}
throw
new
Error
(
"No launching connector"
);
}
/**
* Return the launching connector's arguments.
*/
static
Map
<
String
,
Connector
.
Argument
>
connectorArguments
(
LaunchingConnector
connector
,
String
mainArgs
)
{
Map
<
String
,
Connector
.
Argument
>
arguments
=
connector
.
defaultArguments
();
for
(
String
key
:
arguments
.
keySet
())
{
System
.
out
.
println
(
key
);
}
Connector
.
Argument
mainArg
=
(
Connector
.
Argument
)
arguments
.
get
(
"main"
);
if
(
mainArg
==
null
)
{
throw
new
Error
(
"Bad launching connector"
);
}
mainArg
.
setValue
(
mainArgs
);
Connector
.
Argument
optionsArg
=
(
Connector
.
Argument
)
arguments
.
get
(
"options"
);
if
(
optionsArg
==
null
)
{
throw
new
Error
(
"Bad launching connector"
);
}
optionsArg
.
setValue
(
ARGUMENTS
);
return
arguments
;
}
static
VirtualMachine
launchTarget
(
String
mainArgs
)
{
LaunchingConnector
connector
=
findLaunchingConnector
();
Map
arguments
=
connectorArguments
(
connector
,
mainArgs
);
try
{
return
(
VirtualMachine
)
connector
.
launch
(
arguments
);
}
catch
(
IOException
exc
)
{
throw
new
Error
(
"Unable to launch target VM: "
+
exc
);
}
catch
(
IllegalConnectorArgumentsException
exc
)
{
throw
new
Error
(
"Internal error: "
+
exc
);
}
catch
(
VMStartException
exc
)
{
throw
new
Error
(
"Target VM failed to initialize: "
+
exc
.
getMessage
());
}
}
private
static
void
addClassWatch
(
VirtualMachine
vm
)
{
EventRequestManager
erm
=
vm
.
eventRequestManager
();
ClassPrepareRequest
classPrepareRequest
=
erm
.
createClassPrepareRequest
();
classPrepareRequest
.
addClassFilter
(
CLASS_NAME
);
classPrepareRequest
.
setEnabled
(
true
);
}
private
static
void
addFieldWatch
(
VirtualMachine
vm
,
ReferenceType
refType
)
{
EventRequestManager
erm
=
vm
.
eventRequestManager
();
Field
field
=
refType
.
fieldByName
(
FIELD_NAME
);
ModificationWatchpointRequest
modificationWatchpointRequest
=
erm
.
createModificationWatchpointRequest
(
field
);
modificationWatchpointRequest
.
setSuspendPolicy
(
EventRequest
.
SUSPEND_EVENT_THREAD
);
modificationWatchpointRequest
.
setEnabled
(
true
);
}
}
class
StreamRedirectThread
extends
Thread
{
private
final
BufferedReader
in
;
private
static
final
int
BUFFER_SIZE
=
2048
;
/**
* Set up for copy.
* @param name Name of the thread
* @param in Stream to copy from
* @param out Stream to copy to
*/
StreamRedirectThread
(
String
name
,
InputStream
in
)
{
super
(
name
);
this
.
in
=
new
BufferedReader
(
new
InputStreamReader
(
in
));
}
/**
* Copy.
*/
public
void
run
()
{
try
{
String
line
;
while
((
line
=
in
.
readLine
())
!=
null
)
{
System
.
out
.
println
(
"testvm: "
+
line
);
}.
start
();
// this thread is used to trigger a gc
Thread
d
=
new
Thread
()
{
public
void
run
()
{
while
(
true
)
{
try
{
Thread
.
sleep
(
100
);
}
catch
(
InterruptedException
e
)
{
}
System
.
gc
();
}
}
System
.
out
.
flush
();
}
catch
(
IOException
exc
)
{
System
.
err
.
println
(
"Child I/O Transfer - "
+
exc
);
}
};
d
.
setDaemon
(
true
);
d
.
start
();
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录