src/os/posix/vm/os_posix.cpp

Print this page

        

@@ -60,14 +60,41 @@
     switch(rlim.rlim_cur) {
       case RLIM_INFINITY:
         jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d", current_process_id());
         success = true;
         break;
+
       case 0:
+      {
         jio_snprintf(buffer, bufferSize, "Core dumps have been disabled. To enable core dumping, try \"ulimit -c unlimited\" before starting Java again");
+
+#ifdef LINUX
+        /*
+         * 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};
+        bool is_redirect = false;
+        FILE *core_pattern_file = fopen("/proc/sys/kernel/core_pattern", "r");
+        if(core_pattern_file != NULL){
+          fgets(core_pattern, core_pattern_len, core_pattern_file);
+          fclose(core_pattern_file);
+          is_redirect = core_pattern[0] == '|';
+        }
+
+        if(is_redirect){
+          jio_snprintf(buffer, bufferSize,
+                   "Core dumps may be treated with \"%s\"", &core_pattern[1]);
+        }
+#endif
+
         success = false;
         break;
+      }
+
       default:
         jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", current_process_id(), (unsigned long)(rlim.rlim_cur >> 10));
         success = true;
         break;
     }