1298 if (msg != NULL) { 1299 st->print(": %s", java_lang_String::as_utf8_string(msg)); 1300 } 1301 } 1302 1303 1304 void java_lang_Throwable::print(Handle throwable, outputStream* st) { 1305 ResourceMark rm; 1306 Klass* k = throwable->klass(); 1307 assert(k != NULL, "just checking"); 1308 st->print("%s", InstanceKlass::cast(k)->external_name()); 1309 oop msg = message(throwable); 1310 if (msg != NULL) { 1311 st->print(": %s", java_lang_String::as_utf8_string(msg)); 1312 } 1313 } 1314 1315 // After this many redefines, the stack trace is unreliable. 1316 const int MAX_VERSION = USHRT_MAX; 1317 1318 // Helper backtrace functions to store bci|version together. 1319 static inline int merge_bci_and_version(int bci, int version) { 1320 // only store u2 for version, checking for overflow. 1321 if (version > USHRT_MAX || version < 0) version = MAX_VERSION; 1322 assert((jushort)bci == bci, "bci should be short"); 1323 return build_int_from_shorts(version, bci); 1324 } 1325 1326 static inline int bci_at(unsigned int merged) { 1327 return extract_high_short_from_int(merged); 1328 } 1329 static inline int version_at(unsigned int merged) { 1330 return extract_low_short_from_int(merged); 1331 } 1332 1333 static inline bool version_matches(Method* method, int version) { 1334 assert(version < MAX_VERSION, "version is too big"); 1335 return method != NULL && (method->constants()->version() == version); 1336 } 1337 1338 static inline int get_line_number(Method* method, int bci) { 1339 int line_number = 0; 1340 if (method->is_native()) { 1341 // Negative value different from -1 below, enabling Java code in 1342 // class java.lang.StackTraceElement to distinguish "native" from 1343 // "no LineNumberTable". JDK tests for -2. 1344 line_number = -2; 1345 } else { 1346 // Returns -1 if no LineNumberTable, and otherwise actual line number 1347 line_number = method->line_number_from_bci(bci); 1348 if (line_number == -1 && ShowHiddenFrames) { 1349 line_number = bci + 1000000; 1350 } 1351 } 1352 return line_number; 1353 } 1354 1355 // This class provides a simple wrapper over the internal structure of 1356 // exception backtrace to insulate users of the backtrace from needing 1357 // to know what it looks like. 1358 class BacktraceBuilder: public StackObj { 1359 private: 1360 Handle _backtrace; 1361 objArrayOop _head; 1362 typeArrayOop _methods; 1363 typeArrayOop _bcis; 1364 objArrayOop _mirrors; 1365 typeArrayOop _cprefs; // needed to insulate method name against redefinition 1366 int _index; 1367 No_Safepoint_Verifier _nsv; 1368 1369 public: 1370 1371 enum { 1372 trace_methods_offset = java_lang_Throwable::trace_methods_offset, 1373 trace_bcis_offset = java_lang_Throwable::trace_bcis_offset, 1374 trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset, 1456 _index = 0; 1457 } 1458 1459 oop backtrace() { 1460 return _backtrace(); 1461 } 1462 1463 inline void push(Method* method, int bci, TRAPS) { 1464 // Smear the -1 bci to 0 since the array only holds unsigned 1465 // shorts. The later line number lookup would just smear the -1 1466 // to a 0 even if it could be recorded. 1467 if (bci == SynchronizationEntryBCI) bci = 0; 1468 1469 if (_index >= trace_chunk_size) { 1470 methodHandle mhandle(THREAD, method); 1471 expand(CHECK); 1472 method = mhandle(); 1473 } 1474 1475 _methods->short_at_put(_index, method->orig_method_idnum()); 1476 _bcis->int_at_put(_index, merge_bci_and_version(bci, method->constants()->version())); 1477 _cprefs->short_at_put(_index, method->name_index()); 1478 1479 // We need to save the mirrors in the backtrace to keep the class 1480 // from being unloaded while we still have this stack trace. 1481 assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror"); 1482 _mirrors->obj_at_put(_index, method->method_holder()->java_mirror()); 1483 _index++; 1484 } 1485 1486 }; 1487 1488 Symbol* get_source_file_name(InstanceKlass* holder, int version) { 1489 // Find the specific ik version that contains this source_file_name_index 1490 // via the previous versions list, but use the current version's 1491 // constant pool to look it up. The previous version's index has been 1492 // merged for the current constant pool. 1493 InstanceKlass* ik = holder->get_klass_version(version); 1494 // This version has been cleaned up. 1495 if (ik == NULL) return NULL; 1496 int source_file_name_index = ik->source_file_name_index(); 1497 return (source_file_name_index == 0) ? 1498 (Symbol*)NULL : holder->constants()->symbol_at(source_file_name_index); 1499 } 1500 1501 // Print stack trace element to resource allocated buffer 1502 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror, 1503 int method_id, int version, int bci, int cpref) { 1504 1505 // Get strings and string lengths 1506 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1507 const char* klass_name = holder->external_name(); 1508 int buf_len = (int)strlen(klass_name); 1509 1510 Method* method = holder->method_with_orig_idnum(method_id, version); 1511 1512 // The method can be NULL if the requested class version is gone 1513 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1514 char* method_name = sym->as_C_string(); 1515 buf_len += (int)strlen(method_name); 1516 1517 char* source_file_name = NULL; 1518 Symbol* source = get_source_file_name(holder, version); 1519 if (source != NULL) { 1520 source_file_name = source->as_C_string(); 1521 buf_len += (int)strlen(source_file_name); 1522 } 1523 1524 // Allocate temporary buffer with extra space for formatting and line number 1525 char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64); 1526 1527 // Print stack trace line in buffer 1528 sprintf(buf, "\tat %s.%s", klass_name, method_name); 1529 1530 if (!version_matches(method, version)) { 1531 strcat(buf, "(Redefined)"); 1532 } else { 1533 int line_number = get_line_number(method, bci); 1534 if (line_number == -2) { 1535 strcat(buf, "(Native Method)"); 1536 } else { 1537 if (source_file_name != NULL && (line_number != -1)) { 1538 // Sourcename and linenumber 1539 sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number); 1540 } else if (source_file_name != NULL) { 1541 // Just sourcename 1542 sprintf(buf + (int)strlen(buf), "(%s)", source_file_name); 1543 } else { 1544 // Neither sourcename nor linenumber 1545 sprintf(buf + (int)strlen(buf), "(Unknown Source)"); 1546 } 1547 nmethod* nm = method->code(); 1548 if (WizardMode && nm != NULL) { 1549 sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm); 1550 } 1551 } 1552 } 1553 1582 objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable()))); 1583 if (result.is_null()) { 1584 st->print_raw_cr(no_stack_trace_message()); 1585 return; 1586 } 1587 1588 while (result.not_null()) { 1589 1590 // Get method id, bci, version and mirror from chunk 1591 typeArrayHandle methods (THREAD, BacktraceBuilder::get_methods(result)); 1592 typeArrayHandle bcis (THREAD, BacktraceBuilder::get_bcis(result)); 1593 objArrayHandle mirrors (THREAD, BacktraceBuilder::get_mirrors(result)); 1594 typeArrayHandle cprefs (THREAD, BacktraceBuilder::get_cprefs(result)); 1595 1596 int length = methods()->length(); 1597 for (int index = 0; index < length; index++) { 1598 Handle mirror(THREAD, mirrors->obj_at(index)); 1599 // NULL mirror means end of stack trace 1600 if (mirror.is_null()) goto handle_cause; 1601 int method = methods->short_at(index); 1602 int version = version_at(bcis->int_at(index)); 1603 int bci = bci_at(bcis->int_at(index)); 1604 int cpref = cprefs->short_at(index); 1605 print_stack_element(st, mirror, method, version, bci, cpref); 1606 } 1607 result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset))); 1608 } 1609 handle_cause: 1610 { 1611 EXCEPTION_MARK; 1612 JavaValue cause(T_OBJECT); 1613 JavaCalls::call_virtual(&cause, 1614 h_throwable, 1615 KlassHandle(THREAD, h_throwable->klass()), 1616 vmSymbols::getCause_name(), 1617 vmSymbols::void_throwable_signature(), 1618 THREAD); 1619 // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM. 1620 if (HAS_PENDING_EXCEPTION) { 1621 CLEAR_PENDING_EXCEPTION; 1622 h_throwable = Handle(); 1623 } else { 1870 // Compute how many chunks to skip and index into actual chunk 1871 objArrayOop chunk = objArrayOop(backtrace(throwable)); 1872 int skip_chunks = index / trace_chunk_size; 1873 int chunk_index = index % trace_chunk_size; 1874 while (chunk != NULL && skip_chunks > 0) { 1875 chunk = objArrayOop(chunk->obj_at(trace_next_offset)); 1876 skip_chunks--; 1877 } 1878 if (chunk == NULL) { 1879 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1880 } 1881 // Get method id, bci, version, mirror and cpref from chunk 1882 typeArrayOop methods = BacktraceBuilder::get_methods(chunk); 1883 typeArrayOop bcis = BacktraceBuilder::get_bcis(chunk); 1884 objArrayOop mirrors = BacktraceBuilder::get_mirrors(chunk); 1885 typeArrayOop cprefs = BacktraceBuilder::get_cprefs(chunk); 1886 1887 assert(methods != NULL && bcis != NULL && mirrors != NULL, "sanity check"); 1888 1889 int method = methods->short_at(chunk_index); 1890 int version = version_at(bcis->int_at(chunk_index)); 1891 int bci = bci_at(bcis->int_at(chunk_index)); 1892 int cpref = cprefs->short_at(chunk_index); 1893 Handle mirror(THREAD, mirrors->obj_at(chunk_index)); 1894 1895 // Chunk can be partial full 1896 if (mirror.is_null()) { 1897 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1898 } 1899 oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, cpref, CHECK_0); 1900 return element; 1901 } 1902 1903 oop java_lang_StackTraceElement::create(Handle mirror, int method_id, 1904 int version, int bci, int cpref, TRAPS) { 1905 // Allocate java.lang.StackTraceElement instance 1906 Klass* k = SystemDictionary::StackTraceElement_klass(); 1907 assert(k != NULL, "must be loaded in 1.4+"); 1908 instanceKlassHandle ik (THREAD, k); 1909 if (ik->should_be_initialized()) { 1910 ik->initialize(CHECK_0); 1911 } 1912 1913 Handle element = ik->allocate_instance_handle(CHECK_0); 1914 // Fill in class name 1915 ResourceMark rm(THREAD); 1916 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1917 const char* str = holder->external_name(); 1918 oop classname = StringTable::intern((char*) str, CHECK_0); 1919 java_lang_StackTraceElement::set_declaringClass(element(), classname); 1920 1921 Method* method = holder->method_with_orig_idnum(method_id, version); 1922 1923 // The method can be NULL if the requested class version is gone 1924 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1925 1926 // Fill in method name 1927 oop methodname = StringTable::intern(sym, CHECK_0); 1928 java_lang_StackTraceElement::set_methodName(element(), methodname); 1929 1930 if (!version_matches(method, version)) { 1931 // The method was redefined, accurate line number information isn't available 1932 java_lang_StackTraceElement::set_fileName(element(), NULL); 1933 java_lang_StackTraceElement::set_lineNumber(element(), -1); 1934 } else { 1935 // Fill in source file name and line number. 1936 Symbol* source = get_source_file_name(holder, version); 1937 if (ShowHiddenFrames && source == NULL) 1938 source = vmSymbols::unknown_class_name(); 1939 oop filename = StringTable::intern(source, CHECK_0); 1940 java_lang_StackTraceElement::set_fileName(element(), filename); 1941 1942 int line_number = get_line_number(method, bci); 1943 java_lang_StackTraceElement::set_lineNumber(element(), line_number); 1944 } 1945 return element(); 1946 } 1947 1948 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) { 1949 Handle mirror (THREAD, method->method_holder()->java_mirror()); 1950 int method_id = method->orig_method_idnum(); 1951 int cpref = method->name_index(); 1952 return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD); 1953 } 1954 1955 void java_lang_reflect_AccessibleObject::compute_offsets() { 1956 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); 1957 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); 1958 } 1959 1960 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { 1961 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); 1962 return (jboolean) reflect->bool_field(override_offset); 1963 } 1964 1965 void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) { 1966 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); 1967 reflect->bool_field_put(override_offset, (int) value); 1968 } 1969 1970 void java_lang_reflect_Method::compute_offsets() { 1971 Klass* k = SystemDictionary::reflect_Method_klass(); 1972 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); 1973 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); 1974 compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); 3251 int java_lang_boxing_object::value_offset; 3252 int java_lang_boxing_object::long_value_offset; 3253 int java_lang_ref_Reference::referent_offset; 3254 int java_lang_ref_Reference::queue_offset; 3255 int java_lang_ref_Reference::next_offset; 3256 int java_lang_ref_Reference::discovered_offset; 3257 int java_lang_ref_Reference::static_lock_offset; 3258 int java_lang_ref_Reference::static_pending_offset; 3259 int java_lang_ref_Reference::number_of_fake_oop_fields; 3260 int java_lang_ref_SoftReference::timestamp_offset; 3261 int java_lang_ref_SoftReference::static_clock_offset; 3262 int java_lang_ClassLoader::parent_offset; 3263 int java_lang_System::static_in_offset; 3264 int java_lang_System::static_out_offset; 3265 int java_lang_System::static_err_offset; 3266 int java_lang_System::static_security_offset; 3267 int java_lang_StackTraceElement::declaringClass_offset; 3268 int java_lang_StackTraceElement::methodName_offset; 3269 int java_lang_StackTraceElement::fileName_offset; 3270 int java_lang_StackTraceElement::lineNumber_offset; 3271 int java_lang_AssertionStatusDirectives::classes_offset; 3272 int java_lang_AssertionStatusDirectives::classEnabled_offset; 3273 int java_lang_AssertionStatusDirectives::packages_offset; 3274 int java_lang_AssertionStatusDirectives::packageEnabled_offset; 3275 int java_lang_AssertionStatusDirectives::deflt_offset; 3276 int java_nio_Buffer::_limit_offset; 3277 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; 3278 int sun_reflect_ConstantPool::_oop_offset; 3279 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; 3280 3281 3282 // Support for java_lang_StackTraceElement 3283 3284 void java_lang_StackTraceElement::set_fileName(oop element, oop value) { 3285 element->obj_field_put(fileName_offset, value); 3286 } 3287 3288 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) { 3289 element->obj_field_put(declaringClass_offset, value); 3290 } 3291 3292 void java_lang_StackTraceElement::set_methodName(oop element, oop value) { 3293 element->obj_field_put(methodName_offset, value); 3294 } 3295 3296 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) { 3297 element->int_field_put(lineNumber_offset, value); 3298 } 3299 3300 3301 // Support for java Assertions - java_lang_AssertionStatusDirectives. 3302 3303 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { 3304 o->obj_field_put(classes_offset, val); 3305 } 3306 3307 void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) { 3308 o->obj_field_put(classEnabled_offset, val); 3309 } 3310 3311 void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) { 3312 o->obj_field_put(packages_offset, val); 3313 } 3314 3315 void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) { 3316 o->obj_field_put(packageEnabled_offset, val); 3317 } 3318 3319 void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) { 3413 java_lang_invoke_MethodHandle::compute_offsets(); 3414 java_lang_invoke_DirectMethodHandle::compute_offsets(); 3415 java_lang_invoke_MemberName::compute_offsets(); 3416 java_lang_invoke_LambdaForm::compute_offsets(); 3417 java_lang_invoke_MethodType::compute_offsets(); 3418 java_lang_invoke_CallSite::compute_offsets(); 3419 java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets(); 3420 java_security_AccessControlContext::compute_offsets(); 3421 // Initialize reflection classes. The layouts of these classes 3422 // changed with the new reflection implementation in JDK 1.4, and 3423 // since the Universe doesn't know what JDK version it is until this 3424 // point we defer computation of these offsets until now. 3425 java_lang_reflect_AccessibleObject::compute_offsets(); 3426 java_lang_reflect_Method::compute_offsets(); 3427 java_lang_reflect_Constructor::compute_offsets(); 3428 java_lang_reflect_Field::compute_offsets(); 3429 java_nio_Buffer::compute_offsets(); 3430 sun_reflect_ConstantPool::compute_offsets(); 3431 sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets(); 3432 java_lang_reflect_Parameter::compute_offsets(); 3433 3434 // generated interpreter code wants to know about the offsets we just computed: 3435 AbstractAssembler::update_delayed_values(); 3436 } 3437 3438 #ifndef PRODUCT 3439 3440 // These functions exist to assert the validity of hard-coded field offsets to guard 3441 // against changes in the class files 3442 3443 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) { 3444 EXCEPTION_MARK; 3445 fieldDescriptor fd; 3446 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); 3447 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); 3448 instanceKlassHandle h_klass (THREAD, k); 3449 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); 3450 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); 3451 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { 3452 tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name); | 1298 if (msg != NULL) { 1299 st->print(": %s", java_lang_String::as_utf8_string(msg)); 1300 } 1301 } 1302 1303 1304 void java_lang_Throwable::print(Handle throwable, outputStream* st) { 1305 ResourceMark rm; 1306 Klass* k = throwable->klass(); 1307 assert(k != NULL, "just checking"); 1308 st->print("%s", InstanceKlass::cast(k)->external_name()); 1309 oop msg = message(throwable); 1310 if (msg != NULL) { 1311 st->print(": %s", java_lang_String::as_utf8_string(msg)); 1312 } 1313 } 1314 1315 // After this many redefines, the stack trace is unreliable. 1316 const int MAX_VERSION = USHRT_MAX; 1317 1318 static inline bool version_matches(Method* method, int version) { 1319 assert(version < MAX_VERSION, "version is too big"); 1320 return method != NULL && (method->constants()->version() == version); 1321 } 1322 1323 // This class provides a simple wrapper over the internal structure of 1324 // exception backtrace to insulate users of the backtrace from needing 1325 // to know what it looks like. 1326 class BacktraceBuilder: public StackObj { 1327 private: 1328 Handle _backtrace; 1329 objArrayOop _head; 1330 typeArrayOop _methods; 1331 typeArrayOop _bcis; 1332 objArrayOop _mirrors; 1333 typeArrayOop _cprefs; // needed to insulate method name against redefinition 1334 int _index; 1335 No_Safepoint_Verifier _nsv; 1336 1337 public: 1338 1339 enum { 1340 trace_methods_offset = java_lang_Throwable::trace_methods_offset, 1341 trace_bcis_offset = java_lang_Throwable::trace_bcis_offset, 1342 trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset, 1424 _index = 0; 1425 } 1426 1427 oop backtrace() { 1428 return _backtrace(); 1429 } 1430 1431 inline void push(Method* method, int bci, TRAPS) { 1432 // Smear the -1 bci to 0 since the array only holds unsigned 1433 // shorts. The later line number lookup would just smear the -1 1434 // to a 0 even if it could be recorded. 1435 if (bci == SynchronizationEntryBCI) bci = 0; 1436 1437 if (_index >= trace_chunk_size) { 1438 methodHandle mhandle(THREAD, method); 1439 expand(CHECK); 1440 method = mhandle(); 1441 } 1442 1443 _methods->short_at_put(_index, method->orig_method_idnum()); 1444 _bcis->int_at_put(_index, BackTrace::merge_bci_and_version(bci, method->constants()->version())); 1445 _cprefs->short_at_put(_index, method->name_index()); 1446 1447 // We need to save the mirrors in the backtrace to keep the class 1448 // from being unloaded while we still have this stack trace. 1449 assert(method->method_holder()->java_mirror() != NULL, "never push null for mirror"); 1450 _mirrors->obj_at_put(_index, method->method_holder()->java_mirror()); 1451 _index++; 1452 } 1453 1454 }; 1455 1456 // Print stack trace element to resource allocated buffer 1457 char* java_lang_Throwable::print_stack_element_to_buffer(Handle mirror, 1458 int method_id, int version, int bci, int cpref) { 1459 1460 // Get strings and string lengths 1461 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1462 const char* klass_name = holder->external_name(); 1463 int buf_len = (int)strlen(klass_name); 1464 1465 Method* method = holder->method_with_orig_idnum(method_id, version); 1466 1467 // The method can be NULL if the requested class version is gone 1468 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1469 char* method_name = sym->as_C_string(); 1470 buf_len += (int)strlen(method_name); 1471 1472 char* source_file_name = NULL; 1473 Symbol* source = BackTrace::get_source_file_name(holder, version); 1474 if (source != NULL) { 1475 source_file_name = source->as_C_string(); 1476 buf_len += (int)strlen(source_file_name); 1477 } 1478 1479 // Allocate temporary buffer with extra space for formatting and line number 1480 char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64); 1481 1482 // Print stack trace line in buffer 1483 sprintf(buf, "\tat %s.%s", klass_name, method_name); 1484 1485 if (!version_matches(method, version)) { 1486 strcat(buf, "(Redefined)"); 1487 } else { 1488 int line_number = BackTrace::get_line_number(method, bci); 1489 if (line_number == -2) { 1490 strcat(buf, "(Native Method)"); 1491 } else { 1492 if (source_file_name != NULL && (line_number != -1)) { 1493 // Sourcename and linenumber 1494 sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number); 1495 } else if (source_file_name != NULL) { 1496 // Just sourcename 1497 sprintf(buf + (int)strlen(buf), "(%s)", source_file_name); 1498 } else { 1499 // Neither sourcename nor linenumber 1500 sprintf(buf + (int)strlen(buf), "(Unknown Source)"); 1501 } 1502 nmethod* nm = method->code(); 1503 if (WizardMode && nm != NULL) { 1504 sprintf(buf + (int)strlen(buf), "(nmethod " INTPTR_FORMAT ")", (intptr_t)nm); 1505 } 1506 } 1507 } 1508 1537 objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable()))); 1538 if (result.is_null()) { 1539 st->print_raw_cr(no_stack_trace_message()); 1540 return; 1541 } 1542 1543 while (result.not_null()) { 1544 1545 // Get method id, bci, version and mirror from chunk 1546 typeArrayHandle methods (THREAD, BacktraceBuilder::get_methods(result)); 1547 typeArrayHandle bcis (THREAD, BacktraceBuilder::get_bcis(result)); 1548 objArrayHandle mirrors (THREAD, BacktraceBuilder::get_mirrors(result)); 1549 typeArrayHandle cprefs (THREAD, BacktraceBuilder::get_cprefs(result)); 1550 1551 int length = methods()->length(); 1552 for (int index = 0; index < length; index++) { 1553 Handle mirror(THREAD, mirrors->obj_at(index)); 1554 // NULL mirror means end of stack trace 1555 if (mirror.is_null()) goto handle_cause; 1556 int method = methods->short_at(index); 1557 int version = BackTrace::version_at(bcis->int_at(index)); 1558 int bci = BackTrace::bci_at(bcis->int_at(index)); 1559 int cpref = cprefs->short_at(index); 1560 print_stack_element(st, mirror, method, version, bci, cpref); 1561 } 1562 result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset))); 1563 } 1564 handle_cause: 1565 { 1566 EXCEPTION_MARK; 1567 JavaValue cause(T_OBJECT); 1568 JavaCalls::call_virtual(&cause, 1569 h_throwable, 1570 KlassHandle(THREAD, h_throwable->klass()), 1571 vmSymbols::getCause_name(), 1572 vmSymbols::void_throwable_signature(), 1573 THREAD); 1574 // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM. 1575 if (HAS_PENDING_EXCEPTION) { 1576 CLEAR_PENDING_EXCEPTION; 1577 h_throwable = Handle(); 1578 } else { 1825 // Compute how many chunks to skip and index into actual chunk 1826 objArrayOop chunk = objArrayOop(backtrace(throwable)); 1827 int skip_chunks = index / trace_chunk_size; 1828 int chunk_index = index % trace_chunk_size; 1829 while (chunk != NULL && skip_chunks > 0) { 1830 chunk = objArrayOop(chunk->obj_at(trace_next_offset)); 1831 skip_chunks--; 1832 } 1833 if (chunk == NULL) { 1834 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1835 } 1836 // Get method id, bci, version, mirror and cpref from chunk 1837 typeArrayOop methods = BacktraceBuilder::get_methods(chunk); 1838 typeArrayOop bcis = BacktraceBuilder::get_bcis(chunk); 1839 objArrayOop mirrors = BacktraceBuilder::get_mirrors(chunk); 1840 typeArrayOop cprefs = BacktraceBuilder::get_cprefs(chunk); 1841 1842 assert(methods != NULL && bcis != NULL && mirrors != NULL, "sanity check"); 1843 1844 int method = methods->short_at(chunk_index); 1845 int version = BackTrace::version_at(bcis->int_at(chunk_index)); 1846 int bci = BackTrace::bci_at(bcis->int_at(chunk_index)); 1847 int cpref = cprefs->short_at(chunk_index); 1848 Handle mirror(THREAD, mirrors->obj_at(chunk_index)); 1849 1850 // Chunk can be partial full 1851 if (mirror.is_null()) { 1852 THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL); 1853 } 1854 oop element = java_lang_StackTraceElement::create(mirror, method, version, bci, cpref, CHECK_0); 1855 return element; 1856 } 1857 1858 oop java_lang_StackTraceElement::create(Handle mirror, int method_id, 1859 int version, int bci, int cpref, TRAPS) { 1860 // Allocate java.lang.StackTraceElement instance 1861 Klass* k = SystemDictionary::StackTraceElement_klass(); 1862 assert(k != NULL, "must be loaded in 1.4+"); 1863 instanceKlassHandle ik (THREAD, k); 1864 if (ik->should_be_initialized()) { 1865 ik->initialize(CHECK_0); 1866 } 1867 1868 Handle element = ik->allocate_instance_handle(CHECK_0); 1869 java_lang_StackTraceElement::init(element, mirror, method_id, version, bci, cpref, CHECK_0); 1870 return element(); 1871 } 1872 1873 void java_lang_StackTraceElement::init(Handle element, Handle mirror, int method_id, 1874 int version, int bci, int cpref, TRAPS) { 1875 1876 // Fill in class name 1877 ResourceMark rm(THREAD); 1878 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(mirror())); 1879 const char* str = holder->external_name(); 1880 oop classname = StringTable::intern((char*) str, CHECK); 1881 java_lang_StackTraceElement::set_declaringClass(element(), classname); 1882 1883 Method* method = holder->method_with_orig_idnum(method_id, version); 1884 1885 // The method can be NULL if the requested class version is gone 1886 Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref); 1887 1888 // Fill in method name 1889 oop methodname = StringTable::intern(sym, CHECK); 1890 java_lang_StackTraceElement::set_methodName(element(), methodname); 1891 1892 if (!version_matches(method, version)) { 1893 // The method was redefined, accurate line number information isn't available 1894 java_lang_StackTraceElement::set_fileName(element(), NULL); 1895 java_lang_StackTraceElement::set_lineNumber(element(), -1); 1896 } else { 1897 // Fill in source file name and line number. 1898 Symbol* source = BackTrace::get_source_file_name(holder, version); 1899 if (ShowHiddenFrames && source == NULL) 1900 source = vmSymbols::unknown_class_name(); 1901 oop filename = StringTable::intern(source, CHECK); 1902 java_lang_StackTraceElement::set_fileName(element(), filename); 1903 1904 int line_number = BackTrace::get_line_number(method, bci); 1905 java_lang_StackTraceElement::set_lineNumber(element(), line_number); 1906 } 1907 } 1908 1909 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) { 1910 Handle mirror (THREAD, method->method_holder()->java_mirror()); 1911 int method_id = method->orig_method_idnum(); 1912 int cpref = method->name_index(); 1913 return create(mirror, method_id, method->constants()->version(), bci, cpref, THREAD); 1914 } 1915 1916 int java_lang_StackFrameInfo::bci(oop stackFrame) { 1917 int value = stackFrame->int_field(bci_offset); 1918 if (MemberNameInStackFrame) { 1919 return value; 1920 } else { 1921 return BackTrace::bci_at(value); 1922 } 1923 } 1924 1925 oop java_lang_StackFrameInfo::member_name(oop stackFrame) { 1926 return stackFrame->obj_field(memberName_offset); 1927 } 1928 1929 Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* holder, TRAPS) { 1930 if (MemberNameInStackFrame) { 1931 Handle mname(THREAD, stackFrame->obj_field(memberName_offset)); 1932 Method* method = (Method*)java_lang_invoke_MemberName::vmtarget(mname()); 1933 // we should expand MemberName::name when Throwable uses StackTrace 1934 // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL); 1935 return method; 1936 } else { 1937 int bci_version = stackFrame->int_field(bci_offset); 1938 int version = BackTrace::version_at(bci_version); 1939 int mid_cpref = stackFrame->int_field(mid_offset); 1940 int mid = BackTrace::mid_at(mid_cpref); 1941 int cpref = BackTrace::cpref_at(mid_cpref); 1942 return holder->method_with_orig_idnum(mid, version); 1943 } 1944 } 1945 1946 Symbol* java_lang_StackFrameInfo::get_file_name(Handle stackFrame, InstanceKlass* holder) { 1947 if (MemberNameInStackFrame) { 1948 return holder->source_file_name(); 1949 } else { 1950 int bci_version = stackFrame->int_field(bci_offset); 1951 int version = BackTrace::version_at(bci_version); 1952 Symbol* source = BackTrace::get_source_file_name(holder, version); 1953 if (source == NULL) { 1954 source = vmSymbols::unknown_class_name(); 1955 } 1956 return source; 1957 } 1958 } 1959 1960 void java_lang_StackFrameInfo::fill_methodInfo(Handle stackFrame, TRAPS) { 1961 ResourceMark rm(THREAD); 1962 oop k = stackFrame->obj_field(declaringClass_offset); 1963 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(k)); 1964 Method* method = java_lang_StackFrameInfo::get_method(stackFrame, holder, CHECK); 1965 int bci = java_lang_StackFrameInfo::bci(stackFrame()); 1966 1967 // The method can be NULL if the requested class version is gone 1968 Symbol* sym = (method != NULL) ? method->name() : NULL; 1969 if (MemberNameInStackFrame) { 1970 assert(sym != NULL, "MemberName must have method name"); 1971 } else { 1972 bci = BackTrace::bci_at(bci); // merged with version 1973 // The method can be NULL if the requested class version is gone 1974 if (sym == NULL) { 1975 int mid_cpref = stackFrame->int_field(mid_offset); 1976 int cpref = BackTrace::cpref_at(mid_cpref); 1977 sym = holder->constants()->symbol_at(cpref); 1978 } 1979 } 1980 1981 // set method name 1982 oop methodname = StringTable::intern(sym, CHECK); 1983 java_lang_StackFrameInfo::set_methodName(stackFrame(), methodname); 1984 1985 // set file name and line number 1986 Symbol* source = get_file_name(stackFrame, holder); 1987 if (source != NULL) { 1988 oop filename = StringTable::intern(source, CHECK); 1989 java_lang_StackFrameInfo::set_fileName(stackFrame(), filename); 1990 } 1991 if (method != NULL) { 1992 int line_number = BackTrace::get_line_number(method, bci); 1993 java_lang_StackFrameInfo::set_lineNumber(stackFrame(), line_number); 1994 } 1995 } 1996 1997 void java_lang_StackFrameInfo::compute_offsets() { 1998 Klass* k = SystemDictionary::StackFrameInfo_klass(); 1999 compute_offset(declaringClass_offset, k, vmSymbols::declaringClass_name(), vmSymbols::class_signature()); 2000 compute_offset(memberName_offset, k, vmSymbols::memberName_name(), vmSymbols::object_signature()); 2001 compute_offset(mid_offset, k, vmSymbols::mid_name(), vmSymbols::int_signature()); 2002 compute_offset(bci_offset, k, vmSymbols::bci_name(), vmSymbols::int_signature()); 2003 compute_offset(methodName_offset, k, vmSymbols::methodName_name(), vmSymbols::string_signature()); 2004 compute_offset(fileName_offset, k, vmSymbols::fileName_name(), vmSymbols::string_signature()); 2005 compute_offset(lineNumber_offset, k, vmSymbols::lineNumber_name(), vmSymbols::int_signature()); 2006 } 2007 2008 void java_lang_LiveStackFrameInfo::compute_offsets() { 2009 Klass* k = SystemDictionary::LiveStackFrameInfo_klass(); 2010 compute_offset(monitors_offset, k, vmSymbols::monitors_name(), vmSymbols::object_array_signature()); 2011 compute_offset(locals_offset, k, vmSymbols::locals_name(), vmSymbols::object_array_signature()); 2012 compute_offset(operands_offset, k, vmSymbols::operands_name(), vmSymbols::object_array_signature()); 2013 } 2014 2015 void java_lang_reflect_AccessibleObject::compute_offsets() { 2016 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); 2017 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); 2018 } 2019 2020 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { 2021 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); 2022 return (jboolean) reflect->bool_field(override_offset); 2023 } 2024 2025 void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) { 2026 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); 2027 reflect->bool_field_put(override_offset, (int) value); 2028 } 2029 2030 void java_lang_reflect_Method::compute_offsets() { 2031 Klass* k = SystemDictionary::reflect_Method_klass(); 2032 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); 2033 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); 2034 compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); 3311 int java_lang_boxing_object::value_offset; 3312 int java_lang_boxing_object::long_value_offset; 3313 int java_lang_ref_Reference::referent_offset; 3314 int java_lang_ref_Reference::queue_offset; 3315 int java_lang_ref_Reference::next_offset; 3316 int java_lang_ref_Reference::discovered_offset; 3317 int java_lang_ref_Reference::static_lock_offset; 3318 int java_lang_ref_Reference::static_pending_offset; 3319 int java_lang_ref_Reference::number_of_fake_oop_fields; 3320 int java_lang_ref_SoftReference::timestamp_offset; 3321 int java_lang_ref_SoftReference::static_clock_offset; 3322 int java_lang_ClassLoader::parent_offset; 3323 int java_lang_System::static_in_offset; 3324 int java_lang_System::static_out_offset; 3325 int java_lang_System::static_err_offset; 3326 int java_lang_System::static_security_offset; 3327 int java_lang_StackTraceElement::declaringClass_offset; 3328 int java_lang_StackTraceElement::methodName_offset; 3329 int java_lang_StackTraceElement::fileName_offset; 3330 int java_lang_StackTraceElement::lineNumber_offset; 3331 int java_lang_StackFrameInfo::declaringClass_offset; 3332 int java_lang_StackFrameInfo::memberName_offset; 3333 int java_lang_StackFrameInfo::mid_offset; 3334 int java_lang_StackFrameInfo::bci_offset; 3335 int java_lang_StackFrameInfo::methodName_offset; 3336 int java_lang_StackFrameInfo::fileName_offset; 3337 int java_lang_StackFrameInfo::lineNumber_offset; 3338 int java_lang_LiveStackFrameInfo::monitors_offset; 3339 int java_lang_LiveStackFrameInfo::locals_offset; 3340 int java_lang_LiveStackFrameInfo::operands_offset; 3341 int java_lang_AssertionStatusDirectives::classes_offset; 3342 int java_lang_AssertionStatusDirectives::classEnabled_offset; 3343 int java_lang_AssertionStatusDirectives::packages_offset; 3344 int java_lang_AssertionStatusDirectives::packageEnabled_offset; 3345 int java_lang_AssertionStatusDirectives::deflt_offset; 3346 int java_nio_Buffer::_limit_offset; 3347 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0; 3348 int sun_reflect_ConstantPool::_oop_offset; 3349 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset; 3350 3351 3352 // Support for java_lang_StackTraceElement 3353 3354 void java_lang_StackTraceElement::set_fileName(oop element, oop value) { 3355 element->obj_field_put(fileName_offset, value); 3356 } 3357 3358 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) { 3359 element->obj_field_put(declaringClass_offset, value); 3360 } 3361 3362 void java_lang_StackTraceElement::set_methodName(oop element, oop value) { 3363 element->obj_field_put(methodName_offset, value); 3364 } 3365 3366 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) { 3367 element->int_field_put(lineNumber_offset, value); 3368 } 3369 3370 // Support for java_lang_StackFrameInfo 3371 void java_lang_StackFrameInfo::set_declaringClass(oop element, oop value) { 3372 element->obj_field_put(declaringClass_offset, value); 3373 } 3374 3375 void java_lang_StackFrameInfo::set_mid(oop element, int value) { 3376 element->int_field_put(mid_offset, value); 3377 } 3378 void java_lang_StackFrameInfo::set_bci(oop element, int value) { 3379 element->int_field_put(bci_offset, value); 3380 } 3381 3382 void java_lang_StackFrameInfo::set_fileName(oop element, oop value) { 3383 element->obj_field_put(fileName_offset, value); 3384 } 3385 3386 void java_lang_StackFrameInfo::set_methodName(oop element, oop value) { 3387 element->obj_field_put(methodName_offset, value); 3388 } 3389 3390 void java_lang_StackFrameInfo::set_lineNumber(oop element, int value) { 3391 element->int_field_put(lineNumber_offset, value); 3392 } 3393 3394 void java_lang_LiveStackFrameInfo::set_monitors(oop element, oop value) { 3395 element->obj_field_put(monitors_offset, value); 3396 } 3397 3398 void java_lang_LiveStackFrameInfo::set_locals(oop element, oop value) { 3399 element->obj_field_put(locals_offset, value); 3400 } 3401 3402 void java_lang_LiveStackFrameInfo::set_operands(oop element, oop value) { 3403 element->obj_field_put(operands_offset, value); 3404 } 3405 3406 // Support for java Assertions - java_lang_AssertionStatusDirectives. 3407 3408 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { 3409 o->obj_field_put(classes_offset, val); 3410 } 3411 3412 void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) { 3413 o->obj_field_put(classEnabled_offset, val); 3414 } 3415 3416 void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) { 3417 o->obj_field_put(packages_offset, val); 3418 } 3419 3420 void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) { 3421 o->obj_field_put(packageEnabled_offset, val); 3422 } 3423 3424 void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) { 3518 java_lang_invoke_MethodHandle::compute_offsets(); 3519 java_lang_invoke_DirectMethodHandle::compute_offsets(); 3520 java_lang_invoke_MemberName::compute_offsets(); 3521 java_lang_invoke_LambdaForm::compute_offsets(); 3522 java_lang_invoke_MethodType::compute_offsets(); 3523 java_lang_invoke_CallSite::compute_offsets(); 3524 java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets(); 3525 java_security_AccessControlContext::compute_offsets(); 3526 // Initialize reflection classes. The layouts of these classes 3527 // changed with the new reflection implementation in JDK 1.4, and 3528 // since the Universe doesn't know what JDK version it is until this 3529 // point we defer computation of these offsets until now. 3530 java_lang_reflect_AccessibleObject::compute_offsets(); 3531 java_lang_reflect_Method::compute_offsets(); 3532 java_lang_reflect_Constructor::compute_offsets(); 3533 java_lang_reflect_Field::compute_offsets(); 3534 java_nio_Buffer::compute_offsets(); 3535 sun_reflect_ConstantPool::compute_offsets(); 3536 sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets(); 3537 java_lang_reflect_Parameter::compute_offsets(); 3538 java_lang_StackFrameInfo::compute_offsets(); 3539 java_lang_LiveStackFrameInfo::compute_offsets(); 3540 3541 // generated interpreter code wants to know about the offsets we just computed: 3542 AbstractAssembler::update_delayed_values(); 3543 } 3544 3545 #ifndef PRODUCT 3546 3547 // These functions exist to assert the validity of hard-coded field offsets to guard 3548 // against changes in the class files 3549 3550 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) { 3551 EXCEPTION_MARK; 3552 fieldDescriptor fd; 3553 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); 3554 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); 3555 instanceKlassHandle h_klass (THREAD, k); 3556 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); 3557 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); 3558 if (!h_klass->find_local_field(f_name, f_sig, &fd)) { 3559 tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name); |