Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
eb3d0e04
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看板
提交
eb3d0e04
编写于
2月 13, 2012
作者:
F
fparain
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
75ccdc3e
e60c6f4d
变更
11
显示空白变更内容
内联
并排
Showing
11 changed file
with
123 addition
and
74 deletion
+123
-74
agent/src/os/linux/Makefile
agent/src/os/linux/Makefile
+2
-2
agent/src/os/linux/libproc_impl.c
agent/src/os/linux/libproc_impl.c
+6
-5
make/linux/makefiles/saproc.make
make/linux/makefiles/saproc.make
+2
-1
src/os/bsd/vm/decoder_machO.hpp
src/os/bsd/vm/decoder_machO.hpp
+4
-3
src/os/windows/vm/decoder_windows.hpp
src/os/windows/vm/decoder_windows.hpp
+1
-1
src/share/vm/classfile/vmSymbols.hpp
src/share/vm/classfile/vmSymbols.hpp
+1
-0
src/share/vm/utilities/decoder.cpp
src/share/vm/utilities/decoder.cpp
+57
-35
src/share/vm/utilities/decoder.hpp
src/share/vm/utilities/decoder.hpp
+45
-23
src/share/vm/utilities/decoder_elf.hpp
src/share/vm/utilities/decoder_elf.hpp
+2
-2
src/share/vm/utilities/preserveException.cpp
src/share/vm/utilities/preserveException.cpp
+1
-1
src/share/vm/utilities/vmError.hpp
src/share/vm/utilities/vmError.hpp
+2
-1
未找到文件。
agent/src/os/linux/Makefile
浏览文件 @
eb3d0e04
#
#
# Copyright (c) 2002, 20
09
, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2002, 20
12
, 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
...
@@ -40,7 +40,7 @@ OBJS = $(SOURCES:.c=.o)
...
@@ -40,7 +40,7 @@ OBJS = $(SOURCES:.c=.o)
LIBS
=
-lthread_db
LIBS
=
-lthread_db
CFLAGS
=
-c
-fPIC
-g
-D_GNU_SOURCE
-D
$(ARCH)
$(INCLUDES)
CFLAGS
=
-c
-fPIC
-g
-D_GNU_SOURCE
-D
$(ARCH)
$(INCLUDES)
-D_FILE_OFFSET_BITS
=
64
LIBSA
=
$(ARCH)
/libsaproc.so
LIBSA
=
$(ARCH)
/libsaproc.so
...
...
agent/src/os/linux/libproc_impl.c
浏览文件 @
eb3d0e04
/*
/*
* Copyright (c) 2003, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
2
, 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
...
@@ -50,10 +50,6 @@ int pathmap_open(const char* name) {
...
@@ -50,10 +50,6 @@ int pathmap_open(const char* name) {
char
alt_path
[
PATH_MAX
+
1
];
char
alt_path
[
PATH_MAX
+
1
];
init_alt_root
();
init_alt_root
();
fd
=
open
(
name
,
O_RDONLY
);
if
(
fd
>=
0
)
{
return
fd
;
}
if
(
alt_root_len
>
0
)
{
if
(
alt_root_len
>
0
)
{
strcpy
(
alt_path
,
alt_root
);
strcpy
(
alt_path
,
alt_root
);
...
@@ -73,6 +69,11 @@ int pathmap_open(const char* name) {
...
@@ -73,6 +69,11 @@ int pathmap_open(const char* name) {
return
fd
;
return
fd
;
}
}
}
}
}
else
{
fd
=
open
(
name
,
O_RDONLY
);
if
(
fd
>=
0
)
{
return
fd
;
}
}
}
return
-
1
;
return
-
1
;
...
...
make/linux/makefiles/saproc.make
浏览文件 @
eb3d0e04
#
#
# Copyright (c) 2005, 201
1
, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2005, 201
2
, 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
...
@@ -75,6 +75,7 @@ $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
...
@@ -75,6 +75,7 @@ $(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
fi
fi
@
echo
Making SA debugger back-end...
@
echo
Making SA debugger back-end...
$(QUIETLY)
$(CC)
-D
$(BUILDARCH)
-D_GNU_SOURCE
\
$(QUIETLY)
$(CC)
-D
$(BUILDARCH)
-D_GNU_SOURCE
\
-D_FILE_OFFSET_BITS
=
64
\
$(SYMFLAG)
$(ARCHFLAG)
$(SHARED_FLAG)
$(PICFLAG)
\
$(SYMFLAG)
$(ARCHFLAG)
$(SHARED_FLAG)
$(PICFLAG)
\
-I
$(SASRCDIR)
\
-I
$(SASRCDIR)
\
-I
$(GENERATED)
\
-I
$(GENERATED)
\
...
...
src/os/bsd/vm/decoder_machO.hpp
浏览文件 @
eb3d0e04
/*
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011,
2012,
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
...
@@ -29,8 +29,9 @@
...
@@ -29,8 +29,9 @@
#include "utilities/decoder.hpp"
#include "utilities/decoder.hpp"
// Just a placehold for now
// Just a placehold for now, a real implementation should derive
class
MachODecoder
:
public
NullDecoder
{
// from AbstractDecoder
class
MachODecoder
:
public
NullDecoder
{
public:
public:
MachODecoder
()
{
}
MachODecoder
()
{
}
~
MachODecoder
()
{
}
~
MachODecoder
()
{
}
...
...
src/os/windows/vm/decoder_windows.hpp
浏览文件 @
eb3d0e04
...
@@ -36,7 +36,7 @@ typedef BOOL (WINAPI *pfn_SymInitialize)(HANDLE, PCTSTR, BOOL);
...
@@ -36,7 +36,7 @@ typedef BOOL (WINAPI *pfn_SymInitialize)(HANDLE, PCTSTR, BOOL);
typedef
BOOL
(
WINAPI
*
pfn_SymGetSymFromAddr64
)(
HANDLE
,
DWORD64
,
PDWORD64
,
PIMAGEHLP_SYMBOL64
);
typedef
BOOL
(
WINAPI
*
pfn_SymGetSymFromAddr64
)(
HANDLE
,
DWORD64
,
PDWORD64
,
PIMAGEHLP_SYMBOL64
);
typedef
DWORD
(
WINAPI
*
pfn_UndecorateSymbolName
)(
const
char
*
,
char
*
,
DWORD
,
DWORD
);
typedef
DWORD
(
WINAPI
*
pfn_UndecorateSymbolName
)(
const
char
*
,
char
*
,
DWORD
,
DWORD
);
class
WindowsDecoder
:
public
Null
Decoder
{
class
WindowsDecoder
:
public
Abstract
Decoder
{
public:
public:
WindowsDecoder
();
WindowsDecoder
();
...
...
src/share/vm/classfile/vmSymbols.hpp
浏览文件 @
eb3d0e04
...
@@ -284,6 +284,7 @@
...
@@ -284,6 +284,7 @@
template(run_method_name, "run") \
template(run_method_name, "run") \
template(exit_method_name, "exit") \
template(exit_method_name, "exit") \
template(add_method_name, "add") \
template(add_method_name, "add") \
template(remove_method_name, "remove") \
template(parent_name, "parent") \
template(parent_name, "parent") \
template(threads_name, "threads") \
template(threads_name, "threads") \
template(groups_name, "groups") \
template(groups_name, "groups") \
...
...
src/share/vm/utilities/decoder.cpp
浏览文件 @
eb3d0e04
...
@@ -25,7 +25,9 @@
...
@@ -25,7 +25,9 @@
#include "precompiled.hpp"
#include "precompiled.hpp"
#include "prims/jvm.h"
#include "prims/jvm.h"
#include "runtime/mutexLocker.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/os.hpp"
#include "utilities/decoder.hpp"
#include "utilities/decoder.hpp"
#include "utilities/vmError.hpp"
#if defined(_WINDOWS)
#if defined(_WINDOWS)
#include "decoder_windows.hpp"
#include "decoder_windows.hpp"
...
@@ -35,74 +37,94 @@
...
@@ -35,74 +37,94 @@
#include "decoder_elf.hpp"
#include "decoder_elf.hpp"
#endif
#endif
NullDecoder
*
Decoder
::
_decoder
=
NULL
;
AbstractDecoder
*
Decoder
::
_shared_decoder
=
NULL
;
AbstractDecoder
*
Decoder
::
_error_handler_decoder
=
NULL
;
NullDecoder
Decoder
::
_do_nothing_decoder
;
NullDecoder
Decoder
::
_do_nothing_decoder
;
Mutex
*
Decoder
::
_decoder_lock
=
new
Mutex
(
Mutex
::
safepoint
,
Mutex
*
Decoder
::
_shared_decoder_lock
=
new
Mutex
(
Mutex
::
native
,
"DecoderLock"
);
"
Shared
DecoderLock"
);
// _decoder_lock should already acquired before enter this method
AbstractDecoder
*
Decoder
::
get_shared_instance
()
{
NullDecoder
*
Decoder
::
get_decoder
()
{
assert
(
_shared_decoder_lock
!=
NULL
&&
_shared_decoder_lock
->
owned_by_self
(),
assert
(
_decoder_lock
!=
NULL
&&
_decoder_lock
->
owned_by_self
(),
"Require DecoderLock to enter"
);
"Require DecoderLock to enter"
);
if
(
_
decoder
!
=
NULL
)
{
if
(
_
shared_decoder
=
=
NULL
)
{
return
_decoder
;
_shared_decoder
=
create_decoder
()
;
}
}
return
_shared_decoder
;
}
AbstractDecoder
*
Decoder
::
get_error_handler_instance
()
{
if
(
_error_handler_decoder
==
NULL
)
{
_error_handler_decoder
=
create_decoder
();
}
return
_error_handler_decoder
;
}
// Decoder is a secondary service. Although, it is good to have,
// but we can live without it.
AbstractDecoder
*
Decoder
::
create_decoder
()
{
AbstractDecoder
*
decoder
;
#if defined(_WINDOWS)
#if defined(_WINDOWS)
_
decoder
=
new
(
std
::
nothrow
)
WindowsDecoder
();
decoder
=
new
(
std
::
nothrow
)
WindowsDecoder
();
#elif defined (__APPLE__)
#elif defined (__APPLE__)
_
decoder
=
new
(
std
::
nothrow
)
MachODecoder
();
decoder
=
new
(
std
::
nothrow
)
MachODecoder
();
#else
#else
_
decoder
=
new
(
std
::
nothrow
)
ElfDecoder
();
decoder
=
new
(
std
::
nothrow
)
ElfDecoder
();
#endif
#endif
if
(
_decoder
==
NULL
||
_
decoder
->
has_error
())
{
if
(
decoder
==
NULL
||
decoder
->
has_error
())
{
if
(
_
decoder
!=
NULL
)
{
if
(
decoder
!=
NULL
)
{
delete
_
decoder
;
delete
decoder
;
}
}
_
decoder
=
&
_do_nothing_decoder
;
decoder
=
&
_do_nothing_decoder
;
}
}
return
_
decoder
;
return
decoder
;
}
}
bool
Decoder
::
decode
(
address
addr
,
char
*
buf
,
int
buflen
,
int
*
offset
,
const
char
*
modulepath
)
{
bool
Decoder
::
decode
(
address
addr
,
char
*
buf
,
int
buflen
,
int
*
offset
,
const
char
*
modulepath
)
{
assert
(
_decoder_lock
!=
NULL
,
"Just check"
);
assert
(
_shared_decoder_lock
!=
NULL
,
"Just check"
);
MutexLockerEx
locker
(
_decoder_lock
,
true
);
bool
error_handling_thread
=
os
::
current_thread_id
()
==
VMError
::
first_error_tid
;
NullDecoder
*
decoder
=
get_decoder
();
MutexLockerEx
locker
(
error_handling_thread
?
NULL
:
_shared_decoder_lock
,
true
);
AbstractDecoder
*
decoder
=
error_handling_thread
?
get_error_handler_instance
()
:
get_shared_instance
();
assert
(
decoder
!=
NULL
,
"null decoder"
);
assert
(
decoder
!=
NULL
,
"null decoder"
);
return
decoder
->
decode
(
addr
,
buf
,
buflen
,
offset
,
modulepath
);
return
decoder
->
decode
(
addr
,
buf
,
buflen
,
offset
,
modulepath
);
}
}
bool
Decoder
::
demangle
(
const
char
*
symbol
,
char
*
buf
,
int
buflen
)
{
bool
Decoder
::
demangle
(
const
char
*
symbol
,
char
*
buf
,
int
buflen
)
{
assert
(
_decoder_lock
!=
NULL
,
"Just check"
);
assert
(
_shared_decoder_lock
!=
NULL
,
"Just check"
);
MutexLockerEx
locker
(
_decoder_lock
,
true
);
bool
error_handling_thread
=
os
::
current_thread_id
()
==
VMError
::
first_error_tid
;
NullDecoder
*
decoder
=
get_decoder
();
MutexLockerEx
locker
(
error_handling_thread
?
NULL
:
_shared_decoder_lock
,
true
);
AbstractDecoder
*
decoder
=
error_handling_thread
?
get_error_handler_instance
()
:
get_shared_instance
();
assert
(
decoder
!=
NULL
,
"null decoder"
);
assert
(
decoder
!=
NULL
,
"null decoder"
);
return
decoder
->
demangle
(
symbol
,
buf
,
buflen
);
return
decoder
->
demangle
(
symbol
,
buf
,
buflen
);
}
}
bool
Decoder
::
can_decode_C_frame_in_vm
()
{
bool
Decoder
::
can_decode_C_frame_in_vm
()
{
assert
(
_decoder_lock
!=
NULL
,
"Just check"
);
assert
(
_shared_decoder_lock
!=
NULL
,
"Just check"
);
MutexLockerEx
locker
(
_decoder_lock
,
true
);
bool
error_handling_thread
=
os
::
current_thread_id
()
==
VMError
::
first_error_tid
;
NullDecoder
*
decoder
=
get_decoder
();
MutexLockerEx
locker
(
error_handling_thread
?
NULL
:
_shared_decoder_lock
,
true
);
AbstractDecoder
*
decoder
=
error_handling_thread
?
get_error_handler_instance
()
:
get_shared_instance
();
assert
(
decoder
!=
NULL
,
"null decoder"
);
assert
(
decoder
!=
NULL
,
"null decoder"
);
return
decoder
->
can_decode_C_frame_in_vm
();
return
decoder
->
can_decode_C_frame_in_vm
();
}
}
// shutdown real decoder and replace it with
/*
// _do_nothing_decoder
* Shutdown shared decoder and replace it with
* _do_nothing_decoder. Do nothing with error handler
* instance, since the JVM is going down.
*/
void
Decoder
::
shutdown
()
{
void
Decoder
::
shutdown
()
{
assert
(
_decoder_lock
!=
NULL
,
"Just check"
);
assert
(
_
shared_
decoder_lock
!=
NULL
,
"Just check"
);
MutexLockerEx
locker
(
_decoder_lock
,
true
);
MutexLockerEx
locker
(
_
shared_
decoder_lock
,
true
);
if
(
_decoder
!=
NULL
&&
_decoder
!=
&
_do_nothing_decoder
)
{
if
(
_shared_decoder
!=
NULL
&&
delete
_decoder
;
_shared_decoder
!=
&
_do_nothing_decoder
)
{
delete
_shared_decoder
;
}
}
_decoder
=
&
_do_nothing_decoder
;
_
shared_
decoder
=
&
_do_nothing_decoder
;
}
}
src/share/vm/utilities/decoder.hpp
浏览文件 @
eb3d0e04
/*
/*
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, 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
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
#include "memory/allocation.hpp"
#include "memory/allocation.hpp"
#include "runtime/mutex.hpp"
#include "runtime/mutex.hpp"
class
NullDecoder
:
public
CHeapObj
{
class
AbstractDecoder
:
public
CHeapObj
{
public:
public:
// status code for decoding native C frame
// status code for decoding native C frame
enum
decoder_status
{
enum
decoder_status
{
...
@@ -43,6 +43,34 @@ public:
...
@@ -43,6 +43,34 @@ public:
helper_init_error
// SymInitialize failed (Windows only)
helper_init_error
// SymInitialize failed (Windows only)
};
};
// decode an pc address to corresponding function name and an offset from the beginning of
// the function
virtual
bool
decode
(
address
pc
,
char
*
buf
,
int
buflen
,
int
*
offset
,
const
char
*
modulepath
=
NULL
)
=
0
;
// demangle a C++ symbol
virtual
bool
demangle
(
const
char
*
symbol
,
char
*
buf
,
int
buflen
)
=
0
;
// if the decoder can decode symbols in vm
virtual
bool
can_decode_C_frame_in_vm
()
const
=
0
;
virtual
decoder_status
status
()
const
{
return
_decoder_status
;
}
virtual
bool
has_error
()
const
{
return
is_error
(
_decoder_status
);
}
static
bool
is_error
(
decoder_status
status
)
{
return
(
status
>
0
);
}
protected:
decoder_status
_decoder_status
;
};
// Do nothing decoder
class
NullDecoder
:
public
AbstractDecoder
{
public:
NullDecoder
()
{
NullDecoder
()
{
_decoder_status
=
not_available
;
_decoder_status
=
not_available
;
}
}
...
@@ -61,40 +89,34 @@ public:
...
@@ -61,40 +89,34 @@ public:
virtual
bool
can_decode_C_frame_in_vm
()
const
{
virtual
bool
can_decode_C_frame_in_vm
()
const
{
return
false
;
return
false
;
}
}
virtual
decoder_status
status
()
const
{
return
_decoder_status
;
}
virtual
bool
has_error
()
const
{
return
is_error
(
_decoder_status
);
}
static
bool
is_error
(
decoder_status
status
)
{
return
(
status
>
0
);
}
protected:
decoder_status
_decoder_status
;
};
};
class
Decoder
:
AllStatic
{
class
Decoder
:
AllStatic
{
public:
public:
static
bool
decode
(
address
pc
,
char
*
buf
,
int
buflen
,
int
*
offset
,
const
char
*
modulepath
=
NULL
);
static
bool
decode
(
address
pc
,
char
*
buf
,
int
buflen
,
int
*
offset
,
const
char
*
modulepath
=
NULL
);
static
bool
demangle
(
const
char
*
symbol
,
char
*
buf
,
int
buflen
);
static
bool
demangle
(
const
char
*
symbol
,
char
*
buf
,
int
buflen
);
static
bool
can_decode_C_frame_in_vm
();
static
bool
can_decode_C_frame_in_vm
();
// shutdown shared instance
static
void
shutdown
();
static
void
shutdown
();
protected:
protected:
static
NullDecoder
*
get_decoder
();
// shared decoder instance, _shared_instance_lock is needed
static
AbstractDecoder
*
get_shared_instance
();
// a private instance for error handler. Error handler can be
// triggered almost everywhere, including signal handler, where
// no lock can be taken. So the shared decoder can not be used
// in this scenario.
static
AbstractDecoder
*
get_error_handler_instance
();
static
AbstractDecoder
*
create_decoder
();
private:
private:
static
NullDecoder
*
_decoder
;
static
AbstractDecoder
*
_shared_decoder
;
static
AbstractDecoder
*
_error_handler_decoder
;
static
NullDecoder
_do_nothing_decoder
;
static
NullDecoder
_do_nothing_decoder
;
protected:
protected:
static
Mutex
*
_decoder_lock
;
static
Mutex
*
_shared
_decoder_lock
;
};
};
#endif // SHARE_VM_UTILITIES_DECODER_HPP
#endif // SHARE_VM_UTILITIES_DECODER_HPP
src/share/vm/utilities/decoder_elf.hpp
浏览文件 @
eb3d0e04
/*
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011,
2012,
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
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
#include "utilities/decoder.hpp"
#include "utilities/decoder.hpp"
#include "utilities/elfFile.hpp"
#include "utilities/elfFile.hpp"
class
ElfDecoder
:
public
Null
Decoder
{
class
ElfDecoder
:
public
Abstract
Decoder
{
public:
public:
ElfDecoder
()
{
ElfDecoder
()
{
...
...
src/share/vm/utilities/preserveException.cpp
浏览文件 @
eb3d0e04
...
@@ -32,9 +32,9 @@ PreserveExceptionMark::PreserveExceptionMark(Thread*& thread) {
...
@@ -32,9 +32,9 @@ PreserveExceptionMark::PreserveExceptionMark(Thread*& thread) {
thread
=
Thread
::
current
();
thread
=
Thread
::
current
();
_thread
=
thread
;
_thread
=
thread
;
_preserved_exception_oop
=
Handle
(
thread
,
_thread
->
pending_exception
());
_preserved_exception_oop
=
Handle
(
thread
,
_thread
->
pending_exception
());
_thread
->
clear_pending_exception
();
// Needed to avoid infinite recursion
_preserved_exception_line
=
_thread
->
exception_line
();
_preserved_exception_line
=
_thread
->
exception_line
();
_preserved_exception_file
=
_thread
->
exception_file
();
_preserved_exception_file
=
_thread
->
exception_file
();
_thread
->
clear_pending_exception
();
// Needed to avoid infinite recursion
}
}
...
...
src/share/vm/utilities/vmError.hpp
浏览文件 @
eb3d0e04
...
@@ -27,11 +27,12 @@
...
@@ -27,11 +27,12 @@
#include "utilities/globalDefinitions.hpp"
#include "utilities/globalDefinitions.hpp"
class
Decoder
;
class
VM_ReportJavaOutOfMemory
;
class
VM_ReportJavaOutOfMemory
;
class
VMError
:
public
StackObj
{
class
VMError
:
public
StackObj
{
friend
class
VM_ReportJavaOutOfMemory
;
friend
class
VM_ReportJavaOutOfMemory
;
friend
class
Decoder
;
enum
ErrorType
{
enum
ErrorType
{
internal_error
=
0xe0000000
,
internal_error
=
0xe0000000
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录