src/os/linux/vm/os_linux.cpp
Print this page
*** 5986,6002 ****
}
// Get the default path to the core file
// Returns the length of the string
int os::get_core_path(char* buffer, size_t bufferSize) {
! const char* p = get_current_directory(buffer, bufferSize);
if (p == NULL) {
assert(p != NULL, "failed to get current directory");
return 0;
}
return strlen(buffer);
}
/////////////// Unit tests ///////////////
--- 5986,6059 ----
}
// Get the default path to the core file
// Returns the length of the string
int os::get_core_path(char* buffer, size_t bufferSize) {
! /*
! * Max length of /proc/sys/kernel/core_pattern is 128 characters.
! * See https://www.kernel.org/doc/Documentation/sysctl/kernel.txt
! */
! const int core_pattern_len = 129;
! char core_pattern[core_pattern_len] = {0};
+ int core_pattern_file = ::open("/proc/sys/kernel/core_pattern", O_RDONLY);
+ if (core_pattern_file != -1) {
+ ssize_t ret = ::read(core_pattern_file, core_pattern, core_pattern_len);
+ ::close(core_pattern_file);
+
+ if (ret > 0) {
+ char *last_char = core_pattern + strlen(core_pattern) - 1;
+
+ if (*last_char == '\n') {
+ *last_char = '\0';
+ }
+ }
+ }
+
+ if (strlen(core_pattern) == 0) {
+ return 0;
+ }
+
+ char *pid_pos = strstr(core_pattern, "%p");
+ size_t written;
+
+ if (core_pattern[0] == '/') {
+ written = jio_snprintf(buffer, bufferSize, core_pattern);
+ } else {
+ char cwd[PATH_MAX];
+
+ const char* p = get_current_directory(cwd, PATH_MAX);
if (p == NULL) {
assert(p != NULL, "failed to get current directory");
return 0;
}
+ if (core_pattern[0] == '|') {
+ written = jio_snprintf(buffer, bufferSize,
+ "\"%s\" (or dumping to %s/core.%d)",
+ &core_pattern[1], p, current_process_id());
+ } else {
+ written = jio_snprintf(buffer, bufferSize, "%s/%s", p, core_pattern);
+ }
+ }
+
+ if ((written >= 0) && (written < bufferSize)
+ && (pid_pos == NULL) && (core_pattern[0] != '|')) {
+ int core_uses_pid_file = ::open("/proc/sys/kernel/core_uses_pid", O_RDONLY);
+
+ if (core_uses_pid_file != -1) {
+ char core_uses_pid = 0;
+ ssize_t ret = ::read(core_uses_pid_file, &core_uses_pid, 1);
+ ::close(core_uses_pid_file);
+
+ if (core_uses_pid == '1'){
+ jio_snprintf(buffer + written, bufferSize - written,
+ ".%d", current_process_id());
+ }
+ }
+ }
+
return strlen(buffer);
}
/////////////// Unit tests ///////////////