63 |
63 |
64 _verbose = false; |
64 _verbose = false; |
65 _current_step = 0; |
65 _current_step = 0; |
66 _current_step_info = NULL; |
66 _current_step_info = NULL; |
67 |
67 |
68 _message = ""; |
68 _message = NULL; |
|
69 _detail_msg = NULL; |
69 _filename = NULL; |
70 _filename = NULL; |
70 _lineno = 0; |
71 _lineno = 0; |
71 |
72 |
72 _size = 0; |
73 _size = 0; |
73 } |
74 } |
74 |
75 |
75 // Constructor for internal errors |
76 // Constructor for internal errors |
76 VMError::VMError(Thread* thread, const char* message, const char* filename, int lineno) { |
77 VMError::VMError(Thread* thread, const char* filename, int lineno, |
|
78 const char* message, const char * detail_msg) |
|
79 { |
|
80 _thread = thread; |
|
81 _id = internal_error; // Value that's not an OS exception/signal |
|
82 _filename = filename; |
|
83 _lineno = lineno; |
|
84 _message = message; |
|
85 _detail_msg = detail_msg; |
|
86 |
|
87 _verbose = false; |
|
88 _current_step = 0; |
|
89 _current_step_info = NULL; |
|
90 |
|
91 _pc = NULL; |
|
92 _siginfo = NULL; |
|
93 _context = NULL; |
|
94 |
|
95 _size = 0; |
|
96 } |
|
97 |
|
98 // Constructor for OOM errors |
|
99 VMError::VMError(Thread* thread, const char* filename, int lineno, size_t size, |
|
100 const char* message) { |
77 _thread = thread; |
101 _thread = thread; |
78 _id = internal_error; // set it to a value that's not an OS exception/signal |
102 _id = oom_error; // Value that's not an OS exception/signal |
79 _filename = filename; |
103 _filename = filename; |
80 _lineno = lineno; |
104 _lineno = lineno; |
81 _message = message; |
105 _message = message; |
|
106 _detail_msg = NULL; |
82 |
107 |
83 _verbose = false; |
108 _verbose = false; |
84 _current_step = 0; |
109 _current_step = 0; |
85 _current_step_info = NULL; |
110 _current_step_info = NULL; |
86 |
111 |
87 _pc = NULL; |
112 _pc = NULL; |
88 _siginfo = NULL; |
113 _siginfo = NULL; |
89 _context = NULL; |
114 _context = NULL; |
90 |
115 |
91 _size = 0; |
|
92 } |
|
93 |
|
94 // Constructor for OOM errors |
|
95 VMError::VMError(Thread* thread, size_t size, const char* message, const char* filename, int lineno) { |
|
96 _thread = thread; |
|
97 _id = oom_error; // set it to a value that's not an OS exception/signal |
|
98 _filename = filename; |
|
99 _lineno = lineno; |
|
100 _message = message; |
|
101 |
|
102 _verbose = false; |
|
103 _current_step = 0; |
|
104 _current_step_info = NULL; |
|
105 |
|
106 _pc = NULL; |
|
107 _siginfo = NULL; |
|
108 _context = NULL; |
|
109 |
|
110 _size = size; |
116 _size = size; |
111 } |
117 } |
112 |
118 |
113 |
119 |
114 // Constructor for non-fatal errors |
120 // Constructor for non-fatal errors |
115 VMError::VMError(const char* message) { |
121 VMError::VMError(const char* message) { |
116 _thread = NULL; |
122 _thread = NULL; |
117 _id = internal_error; // set it to a value that's not an OS exception/signal |
123 _id = internal_error; // Value that's not an OS exception/signal |
118 _filename = NULL; |
124 _filename = NULL; |
119 _lineno = 0; |
125 _lineno = 0; |
120 _message = message; |
126 _message = message; |
|
127 _detail_msg = NULL; |
121 |
128 |
122 _verbose = false; |
129 _verbose = false; |
123 _current_step = 0; |
130 _current_step = 0; |
124 _current_step_info = NULL; |
131 _current_step_info = NULL; |
125 |
132 |
189 if (signame) { |
196 if (signame) { |
190 jio_snprintf(buf, buflen, |
197 jio_snprintf(buf, buflen, |
191 "%s (0x%x) at pc=" PTR_FORMAT ", pid=%d, tid=" UINTX_FORMAT, |
198 "%s (0x%x) at pc=" PTR_FORMAT ", pid=%d, tid=" UINTX_FORMAT, |
192 signame, _id, _pc, |
199 signame, _id, _pc, |
193 os::current_process_id(), os::current_thread_id()); |
200 os::current_process_id(), os::current_thread_id()); |
|
201 } else if (_filename != NULL && _lineno > 0) { |
|
202 // skip directory names |
|
203 char separator = os::file_separator()[0]; |
|
204 const char *p = strrchr(_filename, separator); |
|
205 int n = jio_snprintf(buf, buflen, |
|
206 "Internal Error at %s:%d, pid=%d, tid=" UINTX_FORMAT, |
|
207 p ? p + 1 : _filename, _lineno, |
|
208 os::current_process_id(), os::current_thread_id()); |
|
209 if (n >= 0 && n < buflen && _message) { |
|
210 if (_detail_msg) { |
|
211 jio_snprintf(buf + n, buflen - n, "%s%s: %s", |
|
212 os::line_separator(), _message, _detail_msg); |
|
213 } else { |
|
214 jio_snprintf(buf + n, buflen - n, "%sError: %s", |
|
215 os::line_separator(), _message); |
|
216 } |
|
217 } |
194 } else { |
218 } else { |
195 if (_filename != NULL && _lineno > 0) { |
219 jio_snprintf(buf, buflen, |
196 // skip directory names |
220 "Internal Error (0x%x), pid=%d, tid=" UINTX_FORMAT, |
197 char separator = os::file_separator()[0]; |
221 _id, os::current_process_id(), os::current_thread_id()); |
198 const char *p = strrchr(_filename, separator); |
|
199 |
|
200 jio_snprintf(buf, buflen, |
|
201 "Internal Error at %s:%d, pid=%d, tid=" UINTX_FORMAT " \nError: %s", |
|
202 p ? p + 1 : _filename, _lineno, |
|
203 os::current_process_id(), os::current_thread_id(), |
|
204 _message ? _message : ""); |
|
205 } else { |
|
206 jio_snprintf(buf, buflen, |
|
207 "Internal Error (0x%x), pid=%d, tid=" UINTX_FORMAT, |
|
208 _id, os::current_process_id(), os::current_thread_id()); |
|
209 } |
|
210 } |
222 } |
211 |
223 |
212 return buf; |
224 return buf; |
213 } |
225 } |
214 |
226 |
367 st->cr(); |
379 st->cr(); |
368 |
380 |
369 STEP(40, "(printing error message)") |
381 STEP(40, "(printing error message)") |
370 |
382 |
371 // error message |
383 // error message |
372 if (_message && _message[0] != '\0') { |
384 if (_detail_msg) { |
|
385 st->print_cr("# %s: %s", _message ? _message : "Error", _detail_msg); |
|
386 } else if (_message) { |
373 st->print_cr("# Error: %s", _message); |
387 st->print_cr("# Error: %s", _message); |
374 } |
388 } |
375 |
389 |
376 STEP(50, "(printing Java version string)") |
390 STEP(50, "(printing Java version string)") |
377 |
391 |