1 Star 0 Fork 84

lyn/openjdk-1.8.0

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
0038-Record-file-descriptor-when-ExtensiveErrorReports-is.patch 6.36 KB
一键复制 编辑 原始数据 按行查看 历史
Date: Fri, 9 Jun 2023 09:45:23 +0800
Subject: [PATCH 38/59] Record file descriptor when ExtensiveErrorReports is enabled
---
hotspot/src/os/aix/vm/os_aix.cpp | 4 +++
hotspot/src/os/bsd/vm/os_bsd.cpp | 4 +++
hotspot/src/os/linux/vm/os_linux.cpp | 40 ++++++++++++++++++++++
hotspot/src/os/solaris/vm/os_solaris.cpp | 4 +++
hotspot/src/os/windows/vm/os_windows.cpp | 4 +++
hotspot/src/share/vm/runtime/os.cpp | 7 ++++
hotspot/src/share/vm/runtime/os.hpp | 2 ++
hotspot/src/share/vm/utilities/vmError.cpp | 10 ++++++
8 files changed, 75 insertions(+)
diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index 6838f33bc..2cf08dce1 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -1617,6 +1617,10 @@ void os::pd_print_cpu_info(outputStream* st) {
st->cr();
}
+void os::pd_print_file_descriptor(outputStream* st) {
+ // Nothing to do for now.
+}
+
void os::print_siginfo(outputStream* st, void* siginfo) {
// Use common posix version.
os::Posix::print_siginfo_brief(st, (const siginfo_t*) siginfo);
diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
index 765b60c0d..7942c8545 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
@@ -1779,6 +1779,10 @@ void os::print_memory_info(outputStream* st) {
st->cr();
}
+void os::pd_print_file_descriptor(outputStream* st) {
+ // Nothing to do for now.
+}
+
void os::print_siginfo(outputStream* st, void* siginfo) {
const siginfo_t* si = (const siginfo_t*)siginfo;
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index e875fee77..b82997568 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -2509,6 +2509,46 @@ void os::print_siginfo(outputStream* st, void* siginfo) {
st->cr();
}
+// max length of file name in linux
+#define MAX_PATH_LEN 256
+// maximum number of file descriptors to print
+#define MAX_PRINT_FD_SIZE 2000
+
+void os::pd_print_file_descriptor(outputStream* st) {
+ int pid = os::current_process_id();
+ char process_path[MAX_PATH_LEN] = {0};
+ (void) snprintf(process_path, MAX_PATH_LEN, "/proc/%d/fd/", pid);
+ st->print_cr("path: %s", process_path);
+
+ DIR *dir = NULL;
+ dir = opendir(process_path);
+ if (dir == NULL) {
+ st->print_cr("opendir %s failed, errno: %d", process_path, errno);
+ return;
+ }
+
+ // Scan the directory, get symbolic link value
+ struct dirent *ptr;
+ ssize_t readlink_ret = 0;
+ char symbolic_link_value[MAX_PATH_LEN] = {0};
+ char filename[MAX_PATH_LEN] = {0};
+ unsigned long file_count = 0;
+ while ((ptr = readdir(dir)) != NULL) {
+ if (ptr->d_type == DT_DIR) continue;
+ if (file_count < MAX_PRINT_FD_SIZE) {
+ (void) snprintf(filename, MAX_PATH_LEN, "%s%s", process_path, ptr->d_name);
+ readlink_ret = readlink(filename, symbolic_link_value, MAX_PATH_LEN);
+ if (readlink_ret > 0) {
+ st->print_cr("%s -> %s", ptr->d_name, symbolic_link_value);
+ } else {
+ st->print_cr("%s: readlink failed, errno: %d", ptr->d_name, errno);
+ }
+ }
+ file_count++;
+ }
+ st->print_cr("Total fd count: %lu", file_count);
+ (void) closedir(dir);
+}
static void print_signal_handler(outputStream* st, int sig,
char* buf, size_t buflen);
diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp
index 9f8c6a9bf..9029238e1 100644
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp
@@ -2094,6 +2094,10 @@ void os::pd_print_cpu_info(outputStream* st) {
// Nothing to do for now.
}
+void os::pd_print_file_descriptor(outputStream* st) {
+ // Nothing to do for now.
+}
+
void os::print_memory_info(outputStream* st) {
st->print("Memory:");
st->print(" %dk page", os::vm_page_size()>>10);
diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp
index f0bc733c2..1017147c8 100644
--- a/hotspot/src/os/windows/vm/os_windows.cpp
+++ b/hotspot/src/os/windows/vm/os_windows.cpp
@@ -1865,6 +1865,10 @@ void os::pd_print_cpu_info(outputStream* st) {
// Nothing to do for now.
}
+void os::pd_print_file_descriptor(outputStream* st) {
+ // Nothing to do for now.
+}
+
void os::print_memory_info(outputStream* st) {
st->print("Memory:");
st->print(" %dk page", os::vm_page_size()>>10);
diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp
index 84841b76e..43d66e85e 100644
--- a/hotspot/src/share/vm/runtime/os.cpp
+++ b/hotspot/src/share/vm/runtime/os.cpp
@@ -861,6 +861,13 @@ void os::print_hex_dump(outputStream* st, address start, address end, int unitsi
st->cr();
}
+void os::print_file_descriptor(outputStream* st) {
+ // file descriptor
+ st->print("File Descriptor:");
+ st->cr();
+ pd_print_file_descriptor(st);
+}
+
void os::print_environment_variables(outputStream* st, const char** env_list,
char* buffer, int len) {
if (env_list) {
diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp
index 6ca220021..988977b17 100644
--- a/hotspot/src/share/vm/runtime/os.hpp
+++ b/hotspot/src/share/vm/runtime/os.hpp
@@ -661,6 +661,8 @@ class os: AllStatic {
static void print_siginfo(outputStream* st, void* siginfo);
static void print_signal_handlers(outputStream* st, char* buf, size_t buflen);
static void print_date_and_time(outputStream* st, char* buf, size_t buflen);
+ static void print_file_descriptor(outputStream* st);
+ static void pd_print_file_descriptor(outputStream* st);
static void print_location(outputStream* st, intptr_t x, bool verbose = false);
static size_t lasterror(char *buf, size_t len);
diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp
index 5bbfade6c..0c5c955bf 100644
--- a/hotspot/src/share/vm/utilities/vmError.cpp
+++ b/hotspot/src/share/vm/utilities/vmError.cpp
@@ -810,6 +810,16 @@ void VMError::report(outputStream* st) {
st->cr();
}
+#if defined(AARCH64) || defined(X86)
+ STEP(207, "(printing file descriptor)" )
+
+ if (ExtensiveErrorReports && _verbose) {
+ // File Descriptor
+ os::print_file_descriptor(st);
+ st->cr();
+ }
+#endif
+
STEP(210, "(printing VM options)" )
if (_verbose) {
--
2.22.0
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lyn1001/openjdk-1.8.0.git
git@gitee.com:lyn1001/openjdk-1.8.0.git
lyn1001
openjdk-1.8.0
openjdk-1.8.0
master

搜索帮助