annotate src/share/vm/utilities/decoder.hpp @ 4872:aa3d708d67c4

7141200: log some interesting information in ring buffers for crashes Reviewed-by: kvn, jrose, kevinw, brutisso, twisti, jmasa
author never
date Wed, 01 Feb 2012 07:59:01 -0800
parents d7e3846464d0
children db006a85bf91
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
1 /*
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
4 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
7 * published by the Free Software Foundation.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
8 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
13 * accompanied this code).
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
14 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
18 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
21 * questions.
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
22 *
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
23 */
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
24
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
25
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
26 #ifndef SHARE_VM_UTILITIES_DECODER_HPP
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
27 #define SHARE_VM_UTILITIES_DECODER_HPP
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
28
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
29 #include "memory/allocation.hpp"
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
30 #include "runtime/mutex.hpp"
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
31
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
32 class NullDecoder: public CHeapObj {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
33 public:
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
34 // status code for decoding native C frame
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
35 enum decoder_status {
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
36 not_available = -10, // real decoder is not available
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
37 no_error = 0, // successfully decoded frames
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
38 out_of_memory, // out of memory
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
39 file_invalid, // invalid elf file
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
40 file_not_found, // could not found symbol file (on windows), such as jvm.pdb or jvm.map
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
41 helper_not_found, // could not load dbghelp.dll (Windows only)
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
42 helper_func_error, // decoding functions not found (Windows only)
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
43 helper_init_error // SymInitialize failed (Windows only)
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
44 };
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
45
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
46 NullDecoder() {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
47 _decoder_status = not_available;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
48 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
49
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
50 ~NullDecoder() {};
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
51
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
52 virtual bool decode(address pc, char* buf, int buflen, int* offset,
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
53 const char* modulepath = NULL) {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
54 return false;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
55 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
56
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
57 virtual bool demangle(const char* symbol, char* buf, int buflen) {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
58 return false;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
59 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
60
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
61 virtual bool can_decode_C_frame_in_vm() const {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
62 return false;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
63 }
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
64
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
65 virtual decoder_status status() const {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
66 return _decoder_status;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
67 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
68
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
69 virtual bool has_error() const {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
70 return is_error(_decoder_status);
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
71 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
72
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
73 static bool is_error(decoder_status status) {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
74 return (status > 0);
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
75 }
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
76
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
77 protected:
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
78 decoder_status _decoder_status;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
79 };
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
80
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
81
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
82 class Decoder: AllStatic {
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
83 public:
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
84 static bool decode(address pc, char* buf, int buflen, int* offset, const char* modulepath = NULL);
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
85 static bool demangle(const char* symbol, char* buf, int buflen);
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
86 static bool can_decode_C_frame_in_vm();
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
87
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
88 static void shutdown();
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
89 protected:
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
90 static NullDecoder* get_decoder();
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
91
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
92 private:
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
93 static NullDecoder* _decoder;
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
94 static NullDecoder _do_nothing_decoder;
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
95
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
96 protected:
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
97 static Mutex* _decoder_lock;
2022
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
98 };
2d4762ec74af 7003748: Decode C stack frames when symbols are presented (PhoneHome project)
zgu
parents:
diff changeset
99
4803
d7e3846464d0 7071311: Decoder enhancement
zgu
parents: 3960
diff changeset
100 #endif // SHARE_VM_UTILITIES_DECODER_HPP