8144219: [posix] Remove redundant code around os::print_siginfo()
For posix platforms, consolidate os::print_siginfo() in os_posix.cpp and remove cds fault special handling Reviewed-by: dholmes, simonis
This commit is contained in:
parent
9c775566e5
commit
6996edcbb5
@ -1647,11 +1647,6 @@ void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
void os::print_siginfo(outputStream* st, void* siginfo) {
|
||||
os::Posix::print_siginfo_brief(st, (const siginfo_t*) siginfo);
|
||||
st->cr();
|
||||
}
|
||||
|
||||
static void print_signal_handler(outputStream* st, int sig,
|
||||
char* buf, size_t buflen);
|
||||
|
||||
|
@ -1710,24 +1710,6 @@ void os::print_memory_info(outputStream* st) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
void os::print_siginfo(outputStream* st, void* siginfo) {
|
||||
const siginfo_t* si = (const siginfo_t*)siginfo;
|
||||
|
||||
os::Posix::print_siginfo_brief(st, si);
|
||||
|
||||
if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
|
||||
UseSharedSpaces) {
|
||||
FileMapInfo* mapinfo = FileMapInfo::current_info();
|
||||
if (mapinfo->is_in_shared_space(si->si_addr)) {
|
||||
st->print("\n\nError accessing class data sharing archive." \
|
||||
" Mapped file inaccessible during execution, " \
|
||||
" possible disk/network problem.");
|
||||
}
|
||||
}
|
||||
st->cr();
|
||||
}
|
||||
|
||||
|
||||
static void print_signal_handler(outputStream* st, int sig,
|
||||
char* buf, size_t buflen);
|
||||
|
||||
|
@ -2237,25 +2237,6 @@ void os::get_summary_cpu_info(char* cpuinfo, size_t length) {
|
||||
#endif
|
||||
}
|
||||
|
||||
void os::print_siginfo(outputStream* st, void* siginfo) {
|
||||
const siginfo_t* si = (const siginfo_t*)siginfo;
|
||||
|
||||
os::Posix::print_siginfo_brief(st, si);
|
||||
#if INCLUDE_CDS
|
||||
if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
|
||||
UseSharedSpaces) {
|
||||
FileMapInfo* mapinfo = FileMapInfo::current_info();
|
||||
if (mapinfo->is_in_shared_space(si->si_addr)) {
|
||||
st->print("\n\nError accessing class data sharing archive." \
|
||||
" Mapped file inaccessible during execution, " \
|
||||
" possible disk/network problem.");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
st->cr();
|
||||
}
|
||||
|
||||
|
||||
static void print_signal_handler(outputStream* st, int sig,
|
||||
char* buf, size_t buflen);
|
||||
|
||||
|
@ -981,50 +981,60 @@ static bool get_signal_code_description(const siginfo_t* si, enum_sigcode_desc_t
|
||||
return true;
|
||||
}
|
||||
|
||||
// A POSIX conform, platform-independend siginfo print routine.
|
||||
// Short print out on one line.
|
||||
void os::Posix::print_siginfo_brief(outputStream* os, const siginfo_t* si) {
|
||||
void os::print_siginfo(outputStream* os, const void* si0) {
|
||||
|
||||
const siginfo_t* const si = (const siginfo_t*) si0;
|
||||
|
||||
char buf[20];
|
||||
os->print("siginfo: ");
|
||||
os->print("siginfo:");
|
||||
|
||||
if (!si) {
|
||||
os->print("<null>");
|
||||
os->print(" <null>");
|
||||
return;
|
||||
}
|
||||
|
||||
// See print_siginfo_full() for details.
|
||||
const int sig = si->si_signo;
|
||||
|
||||
os->print("si_signo: %d (%s)", sig, os::Posix::get_signal_name(sig, buf, sizeof(buf)));
|
||||
os->print(" si_signo: %d (%s)", sig, os::Posix::get_signal_name(sig, buf, sizeof(buf)));
|
||||
|
||||
enum_sigcode_desc_t ed;
|
||||
if (get_signal_code_description(si, &ed)) {
|
||||
os->print(", si_code: %d (%s)", si->si_code, ed.s_name);
|
||||
} else {
|
||||
os->print(", si_code: %d (unknown)", si->si_code);
|
||||
}
|
||||
get_signal_code_description(si, &ed);
|
||||
os->print(", si_code: %d (%s)", si->si_code, ed.s_name);
|
||||
|
||||
if (si->si_errno) {
|
||||
os->print(", si_errno: %d", si->si_errno);
|
||||
}
|
||||
|
||||
const int me = (int) ::getpid();
|
||||
const int pid = (int) si->si_pid;
|
||||
// Output additional information depending on the signal code.
|
||||
|
||||
// Note: Many implementations lump si_addr, si_pid, si_uid etc. together as unions,
|
||||
// so it depends on the context which member to use. For synchronous error signals,
|
||||
// we print si_addr, unless the signal was sent by another process or thread, in
|
||||
// which case we print out pid or tid of the sender.
|
||||
if (si->si_code == SI_USER || si->si_code == SI_QUEUE) {
|
||||
if (IS_VALID_PID(pid) && pid != me) {
|
||||
os->print(", sent from pid: %d (uid: %d)", pid, (int) si->si_uid);
|
||||
const pid_t pid = si->si_pid;
|
||||
os->print(", si_pid: %ld", (long) pid);
|
||||
if (IS_VALID_PID(pid)) {
|
||||
const pid_t me = getpid();
|
||||
if (me == pid) {
|
||||
os->print(" (current process)");
|
||||
}
|
||||
} else {
|
||||
os->print(" (invalid)");
|
||||
}
|
||||
os->print(", si_uid: %ld", (long) si->si_uid);
|
||||
if (sig == SIGCHLD) {
|
||||
os->print(", si_status: %d", si->si_status);
|
||||
}
|
||||
} else if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
|
||||
sig == SIGTRAP || sig == SIGFPE) {
|
||||
os->print(", si_addr: " PTR_FORMAT, p2i(si->si_addr));
|
||||
#ifdef SIGPOLL
|
||||
} else if (sig == SIGPOLL) {
|
||||
os->print(", si_band: " PTR64_FORMAT, (uint64_t)si->si_band);
|
||||
os->print(", si_band: %ld", si->si_band);
|
||||
#endif
|
||||
} else if (sig == SIGCHLD) {
|
||||
os->print_cr(", si_pid: %d, si_uid: %d, si_status: %d", (int) si->si_pid, si->si_uid, si->si_status);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int os::Posix::unblock_thread_signal_mask(const sigset_t *set) {
|
||||
|
@ -73,9 +73,6 @@ public:
|
||||
// Prints a one-line description of a combination of sigaction.sa_flags.
|
||||
static void print_sa_flags(outputStream* st, int flags);
|
||||
|
||||
// A POSIX conform, platform-independend siginfo print routine.
|
||||
static void print_siginfo_brief(outputStream* os, const siginfo_t* si);
|
||||
|
||||
static address ucontext_get_pc(const ucontext_t* ctx);
|
||||
// Set PC into context. Needed for continuation after signal.
|
||||
static void ucontext_set_pc(ucontext_t* ctx, address pc);
|
||||
|
@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "memory/filemap.hpp"
|
||||
#include "runtime/arguments.hpp"
|
||||
#include "runtime/os.hpp"
|
||||
#include "runtime/thread.hpp"
|
||||
@ -122,3 +123,22 @@ void VMError::reset_signal_handlers() {
|
||||
os::Posix::unblock_thread_signal_mask(&newset);
|
||||
|
||||
}
|
||||
|
||||
// Write a hint to the stream in case siginfo relates to a segv/bus error
|
||||
// and the offending address points into CDS archive.
|
||||
void VMError::check_failing_cds_access(outputStream* st, const void* siginfo) {
|
||||
if (siginfo && UseSharedSpaces) {
|
||||
const siginfo_t* const si = (siginfo_t*)siginfo;
|
||||
if (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) {
|
||||
const void* const fault_addr = si->si_addr;
|
||||
if (fault_addr != NULL) {
|
||||
FileMapInfo* const mapinfo = FileMapInfo::current_info();
|
||||
if (mapinfo->is_in_shared_space(fault_addr)) {
|
||||
st->print("Error accessing class data sharing archive. "
|
||||
"Mapped file inaccessible during execution, possible disk/network problem.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1906,23 +1906,6 @@ void os::print_memory_info(outputStream* st) {
|
||||
(void) check_addr0(st);
|
||||
}
|
||||
|
||||
void os::print_siginfo(outputStream* st, void* siginfo) {
|
||||
const siginfo_t* si = (const siginfo_t*)siginfo;
|
||||
|
||||
os::Posix::print_siginfo_brief(st, si);
|
||||
|
||||
if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) &&
|
||||
UseSharedSpaces) {
|
||||
FileMapInfo* mapinfo = FileMapInfo::current_info();
|
||||
if (mapinfo->is_in_shared_space(si->si_addr)) {
|
||||
st->print("\n\nError accessing class data sharing archive." \
|
||||
" Mapped file inaccessible during execution, " \
|
||||
" possible disk/network problem.");
|
||||
}
|
||||
}
|
||||
st->cr();
|
||||
}
|
||||
|
||||
// Moved from whole group, because we need them here for diagnostic
|
||||
// prints.
|
||||
#define OLDMAXSIGNUM 32
|
||||
|
@ -1798,8 +1798,8 @@ void os::print_memory_info(outputStream* st) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
void os::print_siginfo(outputStream *st, void *siginfo) {
|
||||
EXCEPTION_RECORD* er = (EXCEPTION_RECORD*)siginfo;
|
||||
void os::print_siginfo(outputStream *st, const void* siginfo) {
|
||||
const EXCEPTION_RECORD* const er = (EXCEPTION_RECORD*)siginfo;
|
||||
st->print("siginfo:");
|
||||
|
||||
char tmp[64];
|
||||
@ -1819,15 +1819,6 @@ void os::print_siginfo(outputStream *st, void *siginfo) {
|
||||
er->ExceptionInformation[0]);
|
||||
}
|
||||
st->print(" " INTPTR_FORMAT, er->ExceptionInformation[1]);
|
||||
|
||||
if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR && UseSharedSpaces) {
|
||||
FileMapInfo* mapinfo = FileMapInfo::current_info();
|
||||
if (mapinfo->is_in_shared_space((void*)er->ExceptionInformation[1])) {
|
||||
st->print("\n\nError accessing class data sharing archive." \
|
||||
" Mapped file inaccessible during execution, " \
|
||||
" possible disk/network problem.");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
int num = er->NumberParameters;
|
||||
if (num > 0) {
|
||||
|
@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "memory/filemap.hpp"
|
||||
#include "runtime/arguments.hpp"
|
||||
#include "runtime/os.hpp"
|
||||
#include "runtime/thread.hpp"
|
||||
@ -46,3 +47,22 @@ LONG WINAPI crash_handler(struct _EXCEPTION_POINTERS* exceptionInfo) {
|
||||
void VMError::reset_signal_handlers() {
|
||||
SetUnhandledExceptionFilter(crash_handler);
|
||||
}
|
||||
|
||||
// Write a hint to the stream in case siginfo relates to a segv/bus error
|
||||
// and the offending address points into CDS archive.
|
||||
void VMError::check_failing_cds_access(outputStream* st, const void* siginfo) {
|
||||
if (siginfo && UseSharedSpaces) {
|
||||
const EXCEPTION_RECORD* const er = (const EXCEPTION_RECORD*)siginfo;
|
||||
if (er->ExceptionCode == EXCEPTION_IN_PAGE_ERROR &&
|
||||
er->NumberParameters >= 2) {
|
||||
const void* const fault_addr = (const void*) er->ExceptionInformation[1];
|
||||
if (fault_addr != NULL) {
|
||||
FileMapInfo* const mapinfo = FileMapInfo::current_info();
|
||||
if (mapinfo->is_in_shared_space(fault_addr)) {
|
||||
st->print("Error accessing class data sharing archive. "
|
||||
"Mapped file inaccessible during execution, possible disk/network problem.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -606,7 +606,7 @@ class os: AllStatic {
|
||||
static void print_environment_variables(outputStream* st, const char** env_list);
|
||||
static void print_context(outputStream* st, const void* context);
|
||||
static void print_register_info(outputStream* st, const void* context);
|
||||
static void print_siginfo(outputStream* st, void* siginfo);
|
||||
static void print_siginfo(outputStream* st, const 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);
|
||||
|
||||
|
@ -597,6 +597,14 @@ void VMError::report(outputStream* st, bool _verbose) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
STEP(245, "(CDS archive access warning)" )
|
||||
|
||||
// Print an explicit hint if we crashed on access to the CDS archive.
|
||||
if (_verbose && _siginfo) {
|
||||
check_failing_cds_access(st, _siginfo);
|
||||
st->cr();
|
||||
}
|
||||
|
||||
STEP(250, "(printing register info)")
|
||||
|
||||
// decode register contents if possible
|
||||
|
@ -92,6 +92,10 @@ class VMError : public AllStatic {
|
||||
return (id != OOM_MALLOC_ERROR) && (id != OOM_MMAP_ERROR);
|
||||
}
|
||||
|
||||
// Write a hint to the stream in case siginfo relates to a segv/bus error
|
||||
// and the offending address points into CDS store.
|
||||
static void check_failing_cds_access(outputStream* st, const void* siginfo);
|
||||
|
||||
static void report_and_die(Thread* thread, unsigned int sig, address pc, void* siginfo,
|
||||
void* context, const char* detail_fmt, ...) ATTRIBUTE_PRINTF(6, 7);
|
||||
static void report_and_die(const char* message, const char* detail_fmt, ...) ATTRIBUTE_PRINTF(2, 3);
|
||||
|
Loading…
x
Reference in New Issue
Block a user