pkgsrc-wip/edb-debugger-git/patches/patch-plugins_DebuggerCore_...

434 lines
13 KiB
C++

$NetBSD$
--- plugins/DebuggerCore/unix/netbsd/PlatformEvent.cpp.orig 2017-02-19 02:09:05.367273282 +0000
+++ plugins/DebuggerCore/unix/netbsd/PlatformEvent.cpp
@@ -0,0 +1,428 @@
+/*
+Copyright (C) 2006 - 2015 Evan Teran
+ evan.teran@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "PlatformEvent.h"
+#include "edb.h"
+
+namespace DebuggerCorePlugin {
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+PlatformEvent::PlatformEvent() : pid_(0), tid_(0), status_(0) {
+ std::memset(&siginfo_, 0, sizeof(siginfo_t));
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+IDebugEvent *PlatformEvent::clone() const {
+ return new PlatformEvent(*this);
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+IDebugEvent::Message PlatformEvent::createUnexpectedSignalMessage(const QString &name, int number) {
+ return Message(
+ tr("Unexpected Signal Encountered"),
+ tr("<p>The debugged application encountered a %1 (%2).</p>").arg(name).arg(number),
+ tr("% received").arg(name)
+ );
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+IDebugEvent::Message PlatformEvent::error_description() const {
+ Q_ASSERT(is_error());
+
+ auto fault_address = edb::address_t::fromZeroExtended(siginfo_.si_addr);
+
+ std::size_t debuggeePtrSize=edb::v1::pointer_size();
+ bool fullAddressKnown=debuggeePtrSize<=sizeof(void*);
+ const auto addressString=fault_address.toPointerString(fullAddressKnown);
+
+ Message message;
+ switch(code()) {
+ case SIGSEGV:
+ switch(siginfo_.si_code) {
+ case SEGV_MAPERR:
+ message=Message(
+ tr("Illegal Access Fault"),
+ tr("<p>The debugged application encountered a segmentation fault.<br />The address <strong>%1</strong> does not appear to be mapped.</p>").arg(addressString),
+ tr("SIGSEGV: SEGV_MAPERR: Accessed address %1 not mapped").arg(addressString)
+ );
+ break;
+ case SEGV_ACCERR:
+ message=Message(
+ tr("Illegal Access Fault"),
+ tr("<p>The debugged application encountered a segmentation fault.<br />The address <strong>%1</strong> could not be accessed.</p>").arg(addressString),
+ tr("SIGSEGV: SEGV_ACCERR: Access to address %1 not permitted").arg(addressString)
+ );
+ break;
+ default:
+ message=Message(
+ tr("Illegal Access Fault"),
+ tr("<p>The debugged application encountered a segmentation fault.<br />The instruction could not be executed.</p>"),
+ tr("SIGSEGV: Segmentation fault")
+ );
+ break;
+ }
+ break;
+
+ case SIGILL:
+ message=Message(
+ tr("Illegal Instruction Fault"),
+ tr("<p>The debugged application attempted to execute an illegal instruction.</p>"),
+ tr("SIGILL: Illegal instruction")
+ );
+ break;
+ case SIGFPE:
+ switch(siginfo_.si_code) {
+ case FPE_INTDIV:
+ message=Message(
+ tr("Divide By Zero"),
+ tr("<p>The debugged application tried to divide an integer value by an integer divisor of zero or encountered integer division overflow.</p>"),
+ tr("SIGFPE: FPE_INTDIV: Integer division by zero or division overflow")
+ );
+ break;
+ case FPE_FLTDIV:
+ message=Message(
+ tr("Divide By Zero"),
+ tr("<p>The debugged application tried to divide an floating-point value by a floating-point divisor of zero.</p>"),
+ tr("SIGFPE: FPE_FLTDIV: Floating-point division by zero")
+ );
+ break;
+ case FPE_FLTOVF:
+ message=Message(
+ tr("Numeric Overflow"),
+ tr("<p>The debugged application encountered a numeric overflow while performing a floating-point computation.</p>"),
+ tr("SIGFPE: FPE_FLTOVF: Numeric overflow exception")
+ );
+ break;
+ case FPE_FLTUND:
+ message=Message(
+ tr("Numeric Underflow"),
+ tr("<p>The debugged application encountered a numeric underflow while performing a floating-point computation.</p>"),
+ tr("SIGFPE: FPE_FLTUND: Numeric underflow exception")
+ );
+ break;
+ case FPE_FLTRES:
+ message=Message(
+ tr("Inexact Result"),
+ tr("<p>The debugged application encountered an inexact result of a floating-point computation it was performing.</p>"),
+ tr("SIGFPE: FPE_FLTRES: Inexact result exception")
+ );
+ break;
+ case FPE_FLTINV:
+ message=Message(
+ tr("Invalid Operation"),
+ tr("<p>The debugged application attempted to perform an invalid floating-point operation.</p>"),
+ tr("SIGFPE: FPE_FLTINV: Invalid floating-point operation")
+ );
+ break;
+ default:
+ message=Message(
+ tr("Floating Point Exception"),
+ tr("<p>The debugged application encountered a floating-point exception.</p>"),
+ tr("SIGFPE: Floating-point exception")
+ );
+ break;
+ }
+ break;
+
+ case SIGABRT:
+ message=Message(
+ tr("Application Aborted"),
+ tr("<p>The debugged application has aborted.</p>"),
+ tr("SIGABRT: Application aborted")
+ );
+ break;
+ case SIGBUS:
+ message=Message(
+ tr("Bus Error"),
+ tr("<p>The debugged application received a bus error. Typically, this means that it tried to read or write data that is misaligned.</p>"),
+ tr("SIGBUS: Bus error")
+ );
+ break;
+#ifdef SIGSTKFLT
+ case SIGSTKFLT:
+ message=Message(
+ tr("Stack Fault"),
+ tr("<p>The debugged application encountered a stack fault.</p>"),
+ tr("SIGSTKFLT: Stack fault")
+ );
+ break;
+#endif
+ case SIGPIPE:
+ message=Message(
+ tr("Broken Pipe Fault"),
+ tr("<p>The debugged application encountered a broken pipe fault.</p>"),
+ tr("SIGPIPE: Pipe broken")
+ );
+ break;
+#ifdef SIGHUP
+ case SIGHUP:
+ message=createUnexpectedSignalMessage("SIGHUP", SIGHUP);
+ break;
+#endif
+#ifdef SIGINT
+ case SIGINT:
+ message=createUnexpectedSignalMessage("SIGINT", SIGINT);
+ break;
+#endif
+#ifdef SIGQUIT
+ case SIGQUIT:
+ message=createUnexpectedSignalMessage("SIGQUIT", SIGQUIT);
+ break;
+#endif
+#ifdef SIGTRAP
+ case SIGTRAP:
+ message=createUnexpectedSignalMessage("SIGTRAP", SIGTRAP);
+ break;
+#endif
+#ifdef SIGKILL
+ case SIGKILL:
+ message=createUnexpectedSignalMessage("SIGKILL", SIGKILL);
+ break;
+#endif
+#ifdef SIGUSR1
+ case SIGUSR1:
+ message=createUnexpectedSignalMessage("SIGUSR1", SIGUSR1);
+ break;
+#endif
+#ifdef SIGUSR2
+ case SIGUSR2:
+ message=createUnexpectedSignalMessage("SIGUSR2", SIGUSR2);
+ break;
+#endif
+#ifdef SIGALRM
+ case SIGALRM:
+ message=createUnexpectedSignalMessage("SIGALRM", SIGALRM);
+ break;
+#endif
+#ifdef SIGTERM
+ case SIGTERM:
+ message=createUnexpectedSignalMessage("SIGTERM", SIGTERM);
+ break;
+#endif
+#ifdef SIGCHLD
+ case SIGCHLD:
+ message=createUnexpectedSignalMessage("SIGCHLD", SIGCHLD);
+ break;
+#endif
+#ifdef SIGCONT
+ case SIGCONT:
+ message=createUnexpectedSignalMessage("SIGCONT", SIGCONT);
+ break;
+#endif
+#ifdef SIGSTOP
+ case SIGSTOP:
+ message=createUnexpectedSignalMessage("SIGSTOP", SIGSTOP);
+ break;
+#endif
+#ifdef SIGTSTP
+ case SIGTSTP:
+ message=createUnexpectedSignalMessage("SIGTSTP", SIGTSTP);
+ break;
+#endif
+#ifdef SIGTTIN
+ case SIGTTIN:
+ message=createUnexpectedSignalMessage("SIGTTIN", SIGTTIN);
+ break;
+#endif
+#ifdef SIGTTOU
+ case SIGTTOU:
+ message=createUnexpectedSignalMessage("SIGTTOU", SIGTTOU);
+ break;
+#endif
+#ifdef SIGURG
+ case SIGURG:
+ message=createUnexpectedSignalMessage("SIGURG", SIGURG);
+ break;
+#endif
+#ifdef SIGXCPU
+ case SIGXCPU:
+ message=createUnexpectedSignalMessage("SIGXCPU", SIGXCPU);
+ break;
+#endif
+#ifdef SIGXFSZ
+ case SIGXFSZ:
+ message=createUnexpectedSignalMessage("SIGXFSZ", SIGXFSZ);
+ break;
+#endif
+#ifdef SIGVTALRM
+ case SIGVTALRM:
+ message=createUnexpectedSignalMessage("SIGVTALRM", SIGVTALRM);
+ break;
+#endif
+#ifdef SIGPROF
+ case SIGPROF:
+ message=createUnexpectedSignalMessage("SIGPROF", SIGPROF);
+ break;
+#endif
+#ifdef SIGWINCH
+ case SIGWINCH:
+ message=createUnexpectedSignalMessage("SIGWINCH", SIGWINCH);
+ break;
+#endif
+#ifdef SIGIO
+ case SIGIO:
+ message=createUnexpectedSignalMessage("SIGIO", SIGIO);
+ break;
+#endif
+ default:
+ return Message();
+ }
+
+ message.message+="<p>If you would like to pass this exception to the application press Shift+[F7/F8/F9]</p>";
+ message.statusMessage+=". Shift+Run/Step to pass signal to the program";
+ return message;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+IDebugEvent::REASON PlatformEvent::reason() const {
+ // this basically converts our value into a 'switchable' value for convenience
+
+ if(stopped()) {
+ return EVENT_STOPPED;
+ } else if(terminated()) {
+ return EVENT_TERMINATED;
+ } else if(exited()) {
+ return EVENT_EXITED;
+ } else {
+ return EVENT_UNKNOWN;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+IDebugEvent::TRAP_REASON PlatformEvent::trap_reason() const {
+ switch(siginfo_.si_code) {
+ case TRAP_TRACE: return TRAP_STEPPING;
+ default: return TRAP_BREAKPOINT;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool PlatformEvent::exited() const {
+ return WIFEXITED(status_) != 0;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool PlatformEvent::is_error() const {
+ if(stopped()) {
+ switch(code()) {
+ case SIGTRAP:
+ case SIGSTOP:
+ return false;
+ case SIGSEGV:
+ case SIGILL:
+ case SIGFPE:
+ case SIGABRT:
+ case SIGBUS:
+#ifdef SIGSTKFLT
+ case SIGSTKFLT:
+#endif
+ case SIGPIPE:
+ return true;
+ default:
+ return false;
+ }
+ } else {
+ return false;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool PlatformEvent::is_kill() const {
+ return stopped() && code() == SIGKILL;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool PlatformEvent::is_stop() const {
+ return stopped() && code() == SIGSTOP;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool PlatformEvent::is_trap() const {
+ return stopped() && code() == SIGTRAP;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool PlatformEvent::terminated() const {
+ return WIFSIGNALED(status_) != 0;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+bool PlatformEvent::stopped() const {
+ return WIFSTOPPED(status_) != 0;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+edb::pid_t PlatformEvent::process() const {
+ return pid_;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+edb::tid_t PlatformEvent::thread() const {
+ return tid_;
+}
+
+//------------------------------------------------------------------------------
+// Name:
+//------------------------------------------------------------------------------
+int PlatformEvent::code() const {
+ if(stopped()) {
+ return WSTOPSIG(status_);
+ }
+
+ if(terminated()) {
+ return WTERMSIG(status_);
+ }
+
+ if(exited()) {
+ return WEXITSTATUS(status_);
+ }
+
+ return 0;
+}
+
+}