Author: philippe
Date: Sun Dec 13 16:53:46 2015
New Revision: 15747
Log:
Fix 191069 Exiting due to signal not reported in XML output
Patch from Matthias Schwarzott (slightly modified)
Added:
trunk/memcheck/tests/gone_abrt_xml.stderr.exp
trunk/memcheck/tests/gone_abrt_xml.vgtest
Modified:
trunk/NEWS
trunk/coregrind/m_signals.c
trunk/docs/internals/xml-output-protocol4.txt
trunk/memcheck/tests/Makefile.am
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Sun Dec 13 16:53:46 2015
@@ -39,6 +39,7 @@
https://bugs.kde.org/show_bug.cgi?id=XXXXXX
where XXXXXX is the bug number as listed below.
+191069 report fatal signal in XML output
278744 cvtps2pd with redundant RexW
353083 arm64 doesn't implement various xattr system calls
353084 arm64 doesn't support sigpending system call
Modified: trunk/coregrind/m_signals.c
==============================================================================
--- trunk/coregrind/m_signals.c (original)
+++ trunk/coregrind/m_signals.c Sun Dec 13 16:53:46 2015
@@ -1740,14 +1740,26 @@
core = False;
}
- if ( (VG_(clo_verbosity) >= 1 ||
- (could_core && is_signal_from_kernel(tid, sigNo, info->si_code))
- ) &&
- !VG_(clo_xml) ) {
- VG_(umsg)(
- "\n"
- "Process terminating with default action of signal %d (%s)%s\n",
- sigNo, VG_(signame)(sigNo), core ? ": dumping core" : "");
+ if ( VG_(clo_verbosity) >= 1
+ || (could_core && is_signal_from_kernel(tid, sigNo, info->si_code))
+ || VG_(clo_xml) ) {
+ if (VG_(clo_xml)) {
+ VG_(printf_xml)("<fatal_signal>\n");
+ VG_(printf_xml)(" <tid>%d</tid>\n", tid);
+ ThreadState* tst = VG_(get_ThreadState)(tid);
+ if (tst->thread_name) {
+ VG_(printf_xml)(" <threadname>%s</threadname>\n",
+ tst->thread_name);
+ }
+ VG_(printf_xml)(" <signo>%d</signo>\n", sigNo);
+ VG_(printf_xml)(" <signame>%s</signame>\n", VG_(signame)(sigNo));
+ VG_(printf_xml)(" <sicode>%d</sicode>\n", info->si_code);
+ } else {
+ VG_(umsg)(
+ "\n"
+ "Process terminating with default action of signal %d (%s)%s\n",
+ sigNo, VG_(signame)(sigNo), core ? ": dumping core" : "");
+ }
/* Be helpful - decode some more details about this fault */
if (is_signal_from_kernel(tid, sigNo, info->si_code)) {
@@ -1820,13 +1832,21 @@
break;
} /* switch (sigNo) */
- if (event != NULL) {
- if (haveaddr)
- VG_(umsg)(" %s at address %p\n",
- event, info->VKI_SIGINFO_si_addr);
- else
- VG_(umsg)(" %s\n", event);
- }
+ if (VG_(clo_xml)) {
+ if (event != NULL)
+ VG_(printf_xml)(" <event>%s</event>\n", event);
+ if (haveaddr)
+ VG_(printf_xml)(" <siaddr>%p</siaddr>\n",
+ info->VKI_SIGINFO_si_addr);
+ } else {
+ if (event != NULL) {
+ if (haveaddr)
+ VG_(umsg)(" %s at address %p\n",
+ event, info->VKI_SIGINFO_si_addr);
+ else
+ VG_(umsg)(" %s\n", event);
+ }
+ }
}
/* Print a stack trace. Be cautious if the thread's SP is in an
obviously stupid place (not mapped readable) that would
@@ -1845,8 +1865,8 @@
if (tid == 1) { // main thread
Addr esp = VG_(get_SP)(tid);
Addr base = VG_PGROUNDDN(esp - VG_STACK_REDZONE_SZB);
- if (VG_(am_addr_is_in_extensible_client_stack)(base) &&
- VG_(extend_stack)(tid, base)) {
+ if (VG_(am_addr_is_in_extensible_client_stack)(base)
+ && VG_(extend_stack)(tid, base)) {
if (VG_(clo_trace_signals))
VG_(dmsg)(" -> extended stack base to %#lx\n",
VG_PGROUNDDN(esp));
@@ -1889,6 +1909,11 @@
VG_(threads)[1].client_stack_szB);
}
}
+ if (VG_(clo_xml)) {
+ /* postamble */
+ VG_(printf_xml)("</fatal_signal>\n");
+ VG_(printf_xml)("\n");
+ }
}
if (VG_(clo_vgdb) != Vg_VgdbNo
@@ -2683,8 +2708,8 @@
then extend the stack segment.
*/
Addr base = VG_PGROUNDDN(esp - VG_STACK_REDZONE_SZB);
- if (VG_(am_addr_is_in_extensible_client_stack)(base) &&
- VG_(extend_stack)(tid, base)) {
+ if (VG_(am_addr_is_in_extensible_client_stack)(base)
+ && VG_(extend_stack)(tid, base)) {
if (VG_(clo_trace_signals))
VG_(dmsg)(" -> extended stack base to %#lx\n",
VG_PGROUNDDN(fault));
@@ -2783,11 +2808,11 @@
vg_assert(info != NULL);
vg_assert(info->si_signo == sigNo);
- vg_assert(sigNo == VKI_SIGSEGV ||
- sigNo == VKI_SIGBUS ||
- sigNo == VKI_SIGFPE ||
- sigNo == VKI_SIGILL ||
- sigNo == VKI_SIGTRAP);
+ vg_assert(sigNo == VKI_SIGSEGV
+ || sigNo == VKI_SIGBUS
+ || sigNo == VKI_SIGFPE
+ || sigNo == VKI_SIGILL
+ || sigNo == VKI_SIGTRAP);
info->si_code = sanitize_si_code(info->si_code);
Modified: trunk/docs/internals/xml-output-protocol4.txt
==============================================================================
--- trunk/docs/internals/xml-output-protocol4.txt (original)
+++ trunk/docs/internals/xml-output-protocol4.txt Sun Dec 13 16:53:46 2015
@@ -743,3 +743,53 @@
* STACK is only present in case of VALGRIND_PRINTF_BACKTRACE. See above
for a definition of STACK.
+
+====================================================================
+
+FATAL_SIGNAL
+
+FATAL_SIGNAL defines a message that was caused by a signal that killed them
+process.
+
+Definition:
+
+ <fatal_signal>
+ <tid>INT</tid>
+ <threadname>NAME</threadname> if set
+
+ <signo>INT</signo>
+ <signame>NAME</signame>
+
+ <sicode>INT</sicode>
+ <event>NAME</event>
+ <siaddr>ADDR</siaddr>
+
+ STACK
+
+ </fatal_signal>
+
+* The <tid> tag indicates the Valgrind thread number. This value
+ is arbitrary but may be used to determine which threads produced
+ which errors (at least, the first instance of each error).
+
+* The <threadname> tag identifies the name of the thread if it was
+ set by the client application. If no name was set, the tag is
+ omitted.
+
+* The <signo> tag indicates signo value from struct siginfo.
+
+* In <signame> tag there is the decoded name of signo.
+
+* The <sicode> tag contains the sicode from struct siginfo.
+
+* The <event> tag indicates the decoded name of the sicode. If sicode
+ has no name, the tag is omitted.
+
+* The <siaddr> tag indicates the address that is the reason
+ why the signal was triggered. This can be an unaligned pointer value or
+ just the address of not mapped memory that is accessed nevertheless.
+ If the signal reason is not related to an address, the tag is omitted.
+
+* STACK is defined above and shows where the thread was when it
+ catched the signal. When sending the signal to itself using raise,
+ then raise is visible in this stack.
Modified: trunk/memcheck/tests/Makefile.am
==============================================================================
--- trunk/memcheck/tests/Makefile.am (original)
+++ trunk/memcheck/tests/Makefile.am Sun Dec 13 16:53:46 2015
@@ -297,7 +297,8 @@
writev1.stderr.exp writev1.stderr.exp-solaris writev1.vgtest \
xml1.stderr.exp xml1.stdout.exp xml1.vgtest xml1.stderr.exp-s390x-mvc \
threadname.vgtest threadname.stderr.exp \
- threadname_xml.vgtest threadname_xml.stderr.exp
+ threadname_xml.vgtest threadname_xml.stderr.exp \
+ gone_abrt_xml.vgtest gone_abrt_xml.stderr.exp
check_PROGRAMS = \
accounting \
Added: trunk/memcheck/tests/gone_abrt_xml.stderr.exp
==============================================================================
--- trunk/memcheck/tests/gone_abrt_xml.stderr.exp (added)
+++ trunk/memcheck/tests/gone_abrt_xml.stderr.exp Sun Dec 13 16:53:46 2015
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+
+<valgrindoutput>
+
+<protocolversion>4</protocolversion>
+<protocoltool>memcheck</protocoltool>
+
+<preamble>
+ <line>...</line>
+ <line>...</line>
+ <line>...</line>
+ <line>...</line>
+</preamble>
+
+<pid>...</pid>
+<ppid>...</ppid>
+<tool>memcheck</tool>
+
+<args>
+ <vargv>...</vargv>
+ <argv>
+ <exe>./../../gdbserver_tests/gone</exe>
+ <arg>abort</arg>
+ </argv>
+</args>
+
+<status>
+ <state>RUNNING</state>
+ <time>...</time>
+</status>
+
+starting ...
+aborting ...
+<fatal_signal>
+ <tid>...</tid>
+ <signo>6</signo>
+ <signame>SIGABRT</signame>
+ <sicode>0</sicode>
+ <stack>
+ <frame>
+ <ip>0x........</ip>
+ <obj>...</obj>
+ <fn>main</fn>
+ <dir>...</dir>
+ <file>gone.c</file>
+ <line>...</line>
+ </frame>
+ </stack>
+</fatal_signal>
+
+
+<status>
+ <state>FINISHED</state>
+ <time>...</time>
+</status>
+
+<errorcounts>
+</errorcounts>
+
+<suppcounts>...</suppcounts>
+
+</valgrindoutput>
+
Added: trunk/memcheck/tests/gone_abrt_xml.vgtest
==============================================================================
--- trunk/memcheck/tests/gone_abrt_xml.vgtest (added)
+++ trunk/memcheck/tests/gone_abrt_xml.vgtest Sun Dec 13 16:53:46 2015
@@ -0,0 +1,5 @@
+prog: ../../gdbserver_tests/gone
+args: abort
+vgopts: --xml=yes --xml-fd=2 --log-file=/dev/null
+stderr_filter: filter_xml
+cleanup: rm -f vgcore.*
|