< prev index next >

test/native/runtime/test_os.cpp

Print this page
rev 13549 : 8185712: [windows] Improve native symbol decoder
Reviewed-by: goetz, zgu

*** 22,31 **** --- 22,32 ---- */ #include "precompiled.hpp" #include "runtime/os.hpp" #include "unittest.hpp" + #include "utilities/decoder.hpp" static size_t small_page_size() { return os::vm_page_size(); }
*** 141,150 **** --- 142,267 ---- ASSERT_LT(t, eps) << "bad mean"; t = (variance - 0.3355) < 0.0 ? -(variance - 0.3355) : variance - 0.3355; ASSERT_LT(t, eps) << "bad variance"; } + #ifdef _WIN32 + TEST(os, dll_addr_to_function_valid) { + char buf[128] = ""; + int offset = -1; + address valid_function_pointer = (address) JNI_CreateJavaVM; + ASSERT_TRUE(os::dll_address_to_function_name(valid_function_pointer, + buf, sizeof(buf), &offset, true) == true); + ASSERT_TRUE(strstr(buf, "JNI_CreateJavaVM") != NULL); + ASSERT_TRUE(offset >= 0); + } + + // Test that handing down a too-small output buffer will truncate the output + // string correctly but cause no harm otherwise. + TEST(os, dll_addr_to_function_valid_truncated) { + char buf[128] = ""; + int offset = -1; + memset(buf, 'X', sizeof(buf)); + address valid_function_pointer = (address) JNI_CreateJavaVM; + ASSERT_TRUE(os::dll_address_to_function_name(valid_function_pointer, + buf, 10, &offset, true) == true); + ASSERT_TRUE(buf[10 - 1] == '\0'); + ASSERT_TRUE(buf[10] == 'X'); + // Note: compare the first (sizeof buf - 2) bytes only because Windows decoder + // (actually UndecorateSymbolName()) seems to have a bug where it uses one byte less than + // the buffer would offer. + ASSERT_TRUE(strncmp(buf, "JNI_Crea", 8) == 0); + ASSERT_TRUE(offset >= 0); + } + + // Test that handing down invalid addresses will cause no harm and output buffer + // and offset will contain "" and -1, respectively. + TEST(os, dll_addr_to_function_invalid) { + char buf[128]; + int offset; + address invalid_function_pointers[] = { NULL, (address)1, (address)&offset }; + + for (int i = 0; + i < sizeof(invalid_function_pointers) / sizeof(address); + i ++) + { + address addr = invalid_function_pointers[i]; + strcpy(buf, "blabla"); + offset = 12; + ASSERT_TRUE(os::dll_address_to_function_name(addr, buf, sizeof(buf), + &offset, true) == false); + ASSERT_TRUE(buf[0] == '\0'); + ASSERT_TRUE(offset == -1); + } + } + + TEST(os, decoder_get_source_info_valid) { + char buf[128] = ""; + int line = -1; + address valid_function_pointer = (address) JNI_CreateJavaVM; + ASSERT_TRUE(Decoder::get_source_info(valid_function_pointer, buf, sizeof(buf), &line) == true); + ASSERT_TRUE(strcmp(buf, "jni.cpp") == 0); + ASSERT_TRUE(line >= 0); + } + + // Test that handing down a too-small output buffer will truncate the output + // string correctly but cause no harm otherwise. + TEST(os, decoder_get_source_info_valid_truncated) { + char buf[128] = ""; + int line = -1; + memset(buf, 'X', sizeof(buf)); + address valid_function_pointer = (address) JNI_CreateJavaVM; + ASSERT_TRUE(Decoder::get_source_info(valid_function_pointer, buf, 7, &line) == true); + ASSERT_TRUE(buf[7 - 1] == '\0'); + ASSERT_TRUE(buf[7] == 'X'); + ASSERT_TRUE(strcmp(buf, "jni.cp") == 0); + ASSERT_TRUE(line > 0); + } + + // Test that handing down invalid addresses will cause no harm and output buffer + // and line will contain "" and -1, respectively. + TEST(os, decoder_get_source_info_invalid) { + char buf[128] = ""; + int line = -1; + address invalid_function_pointers[] = { NULL, (address)1, (address)&line }; + + for (int i = 0; + i < sizeof(invalid_function_pointers) / sizeof(address); + i ++) + { + address addr = invalid_function_pointers[i]; + // We should fail but not crash + strcpy(buf, "blabla"); + line = 12; + ASSERT_TRUE(Decoder::get_source_info(addr, buf, sizeof(buf), &line) == false); + // buffer should contain "", offset should contain -1 + ASSERT_TRUE(buf[0] == '\0'); + ASSERT_TRUE(line == -1); + } + } + + #ifdef PLATFORM_PRINT_NATIVE_STACK + TEST(os, platform_print_native_stack) { + bufferedStream bs; + // Note: scratch buffer argument to os::platform_print_native_stack is not + // optional! + char scratch_buffer [255]; + for (int i = 0; i < 3; i ++) { + ASSERT_TRUE(os::platform_print_native_stack(&bs, NULL, scratch_buffer, + sizeof(scratch_buffer))); + ASSERT_TRUE(bs.size() > 0); + // This may depend on debug information files being generated and available + // (e.g. not zipped). + ASSERT_TRUE(::strstr(bs.base(), "platform_print_native_stack") != NULL); + #ifdef _WIN32 + // We have source information on Windows. + ASSERT_TRUE(::strstr(bs.base(), "os_windows_x86.cpp") != NULL); + #endif + } + } + #endif + #endif #ifdef ASSERT TEST_VM_ASSERT_MSG(os, page_size_for_region_with_zero_min_pages, "sanity") { size_t region_size = 16 * os::vm_page_size(); os::page_size_for_region_aligned(region_size, 0); // should assert
< prev index next >