You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
1
(6) |
2
(7) |
|
3
(12) |
4
(9) |
5
(12) |
6
(9) |
7
(18) |
8
(10) |
9
(17) |
|
10
(15) |
11
(22) |
12
(16) |
13
(18) |
14
(9) |
15
(14) |
16
(18) |
|
17
(24) |
18
(11) |
19
(15) |
20
(29) |
21
(19) |
22
(20) |
23
(9) |
|
24
(25) |
25
(25) |
26
(38) |
27
(22) |
28
(16) |
29
(17) |
|
|
From: Bart V. A. <bar...@gm...> - 2008-02-07 20:17:13
|
On Feb 4, 2008 5:06 PM, Tom Hughes <th...@cy...> wrote: > It's fully up to date - the difference is because I have the > glibc-debuginfo package installed which means valgrind is able > to resolve source files and line numbers for backtraces where > they pass through libc/libpthread better. So the diff is: > > < by 0x........: start_thread (in libpthread-?.?.so) > --- > > by 0x........: start_thread (pthread_create.c:?) Ah, thanks for the information. But I'm probably still missing something -- after installation of glibc-debuginfo on Fedora 8 and after a full recompile the exp-drd tests still pass on my system: $ rpm -q glibc-debuginfo glibc-debuginfo-2.7.90-6 $ perl tests/vg_regtest exp-drd -- Running tests in exp-drd/tests ------------------------------------- fp_race: valgrind ./fp_race fp_race2: valgrind ./fp_race -m matinv: valgrind ./matinv 30 15 1 pth_barrier: valgrind ./pth_barrier 2 1 1 pth_broadcast: valgrind ./pth_broadcast pth_cond_race: valgrind ./pth_cond_race pth_cond_race2: valgrind ./pth_cond_race -m pth_create_chain: valgrind ./pth_create_chain 100 pth_detached: valgrind ./pth_detached 1 1 pth_detached2: valgrind ./pth_detached 10 10 sem_as_mutex: valgrind ./sem_as_mutex sem_as_mutex2: valgrind ./sem_as_mutex -m sigalrm: valgrind ./sigalrm tc17_sembar: valgrind ./tc17_sembar tc18_semabuse: valgrind ./tc18_semabuse -- Finished tests in exp-drd/tests ------------------------------------- Bart. |
|
From: <sv...@va...> - 2008-02-07 12:31:04
|
Author: sewardj Date: 2008-02-07 12:31:07 +0000 (Thu, 07 Feb 2008) New Revision: 7380 Log: Add a parser for DWARF3 .debug_info, .debug_loc and .debug_range sections, intended to extract variable type and location information and format the information in such a way as to support rapid querying later. The existing DWARF3 "Other Debugging Information" reader (readdwarf.c), which extracts line number and frame unwind information, is unaffected (so as not to break it). In time perhaps the two readers can be integrated. This code parses large (eg 80MB) files fairly quickly. Its speed could probably be doubled with a little further effort. It is minimally tested and fairly untidy. It will be refactored shortly. Added: branches/DATASYMS/coregrind/m_debuginfo/priv_readdwarf3.h branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c Modified: branches/DATASYMS/coregrind/Makefile.am [... diff too large to include ...] |
|
From: <sv...@va...> - 2008-02-07 12:12:49
|
Author: sewardj
Date: 2008-02-07 12:12:54 +0000 (Thu, 07 Feb 2008)
New Revision: 7379
Log:
* to the all-important DebugInfo type, add fields which describe
stack & global variable type and location information
* new function ML_(addVar) to add a variable to the DebugInfo
* (unrelated) fix debug printing in prefersym when the symbol
names are identical (how can this happen? but it does happen.)
Modified:
branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h
branches/DATASYMS/coregrind/m_debuginfo/storage.c
Modified: branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h 2008-02-07 12:05:47 UTC (rev 7378)
+++ branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h 2008-02-07 12:12:54 UTC (rev 7379)
@@ -208,6 +208,28 @@
extern void ML_(ppCfiExpr)( XArray* src, Int ix );
+/* --------------------- VARIABLES --------------------- */
+
+typedef
+ struct {
+ Addr aMin;
+ Addr aMax;
+ XArray* /* of DiVariable */ vars;
+ }
+ DiAddrRange;
+
+typedef
+ struct {
+ UChar* name; /* freestanding, in AR_DINFO */
+ void* typeV; /* FIXME: make this D3Type* */
+ void* gexprV; /* FIXME: make this GExpr* */
+ void* fbGXv; /* FIXME: make this GExpr*. SHARED. */
+ }
+ DiVariable;
+
+Word
+ML_(cmp_for_DiAddrRange_range) ( const void* keyV, const void* elemV );
+
/* --------------------- DEBUGINFO --------------------- */
/* This is the top-level data type. It's a structure which contains
@@ -336,6 +358,29 @@
struct strchunk* next;
UChar strtab[SEGINFO_STRCHUNKSIZE];
} *strchunks;
+
+ /* Variable scope information, as harvested from Dwarf3 files.
+
+ In short it's an
+
+ array of (array of PC address ranges and variables)
+
+ The outer array indexes over scopes, with Entry 0 containing
+ information on variables which exist for any value of the program
+ counter (PC) -- that is, the outermost scope. Entries 1, 2, 3,
+ etc contain information on increasinly deeply nested variables.
+
+ Each inner array is an array of (an address range, and a set
+ of variables that are in scope over that address range).
+
+ The address ranges may not overlap.
+
+ Since Entry 0 in the outer array holds information on variables
+ that exist for any value of the PC (that is, global vars), it
+ follows that Entry 0's inner array can only have one address
+ range pair, one that covers the entire address space.
+ */
+ XArray* /* of OSet of DiAddrRange */varinfo;
};
/* --------------------- functions --------------------- */
@@ -359,6 +404,16 @@
ML_(addStr) will itself measure the length of the string. */
extern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len );
+extern void ML_(addVar)( struct _DebugInfo* di,
+ Int level,
+ Addr aMin,
+ Addr aMax,
+ UChar* name,
+ void* type, /* actually D3Type* */
+ void* gexpr, /* actually GExpr* */
+ void* fbGXv, /* actually GExpr*. SHARED. */
+ Bool show );
+
/* Canonicalise the tables held by 'di', in preparation for use. Call
this after finishing adding entries to these tables. */
extern void ML_(canonicaliseTables) ( struct _DebugInfo* di );
Modified: branches/DATASYMS/coregrind/m_debuginfo/storage.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/storage.c 2008-02-07 12:05:47 UTC (rev 7378)
+++ branches/DATASYMS/coregrind/m_debuginfo/storage.c 2008-02-07 12:12:54 UTC (rev 7379)
@@ -44,6 +44,11 @@
#include "pub_core_libcprint.h"
#include "pub_core_mallocfree.h"
#include "pub_core_xarray.h"
+#include "pub_core_oset.h"
+
+//FIXME: get rid of this
+#include "priv_readdwarf3.h" // ML_(pp_D3Type_C_ishly)
+
#include "priv_storage.h" /* self */
@@ -515,6 +520,134 @@
}
+/* Add a variable description to the variable table. */
+static void* dinfo_zalloc ( SizeT szB ) {
+ void* v;
+ vg_assert(szB > 0);
+ v = VG_(arena_malloc)( VG_AR_DINFO, szB );
+ vg_assert(v);
+ VG_(memset)(v, 0, szB);
+ return v;
+}
+static void dinfo_free ( void* v ) {
+ VG_(arena_free)( VG_AR_DINFO, v );
+}
+static Word cmp_for_DiAddrRange ( const void* keyV, const void* elemV ) {
+ const Addr* key = (const Addr*)keyV;
+ const DiAddrRange* elem = (const DiAddrRange*)elemV;
+ if (0)
+ VG_(printf)("cmp_for_DiAddrRange: %p vs %p\n", *key, elem->aMin);
+ if ((*key) < elem->aMin) return -1;
+ if ((*key) > elem->aMin) return 1;
+ return 0;
+}
+Word ML_(cmp_for_DiAddrRange_range) ( const void* keyV, const void* elemV ) {
+ const Addr* key = (const Addr*)keyV;
+ const DiAddrRange* elem = (const DiAddrRange*)elemV;
+ if (0)
+ VG_(printf)("cmp_for_DiAddrRange_range: %p vs %p\n", *key, elem->aMin);
+ if ((*key) < elem->aMin) return -1;
+ if ((*key) > elem->aMax) return 1;
+ return 0;
+}
+
+/* 'inner' is an XArray of DiAddrRange. Find the entry corresponding
+ to [aMin,aMax]. If that doesn't exist, create one. Take care to
+ preserve the invariant that none of the address ranges overlap.
+ That's unlikely to be the case unless the DWARF3 from which these
+ calls results contains bogus range info; however in the interests
+ of robustness, do handle the case. */
+static DiAddrRange* find_or_create_arange (
+ OSet* /* of DiAddrRange */ inner,
+ Addr aMin,
+ Addr aMax
+ )
+{
+ DiAddrRange* old = VG_(OSetGen_Lookup)( inner, &aMin );
+ if (!old) {
+ DiAddrRange tmp;
+ tmp.aMin = aMin;
+ tmp.aMax = aMax;
+ tmp.vars = VG_(newXA)( dinfo_zalloc, dinfo_free, sizeof(DiVariable) );
+ old = VG_(OSetGen_AllocNode)( inner, sizeof(DiAddrRange) );
+ vg_assert(old);
+ *old = tmp;
+ VG_(OSetGen_Insert)( inner, old );
+ }
+ return old;
+}
+
+void ML_(addVar)( struct _DebugInfo* di,
+ Int level,
+ Addr aMin,
+ Addr aMax,
+ UChar* name,
+ void* typeV, /* actually D3Type* */
+ void* gexprV, /* actually GExpr* */
+ void* fbGXv, /* actually GExpr*. SHARED. */
+ Bool show )
+{
+ OSet* /* of DiAddrRange */ inner;
+ DiAddrRange* range;
+ DiVariable var;
+
+ if (0) {
+ VG_(printf)(" ML_(addVar): level %d %p-%p %s :: ",
+ level, aMin, aMax, name );
+ ML_(pp_D3Type_C_ishly)( typeV );
+ VG_(printf)("\n Var=");
+ ML_(pp_GX)(gexprV);
+ VG_(printf)("\n");
+ if (fbGXv) {
+ VG_(printf)(" FrB=");
+ ML_(pp_GX)( fbGXv );
+ VG_(printf)("\n");
+ } else {
+ VG_(printf)(" FrB=none\n");
+ }
+ VG_(printf)("\n");
+ }
+
+ vg_assert(level >= 0);
+ vg_assert(aMin <= aMax);
+ vg_assert(name);
+ vg_assert(typeV);
+ vg_assert(gexprV);
+
+ if (!di->varinfo) {
+ di->varinfo = VG_(newXA)( dinfo_zalloc, dinfo_free, sizeof(OSet*) );
+ }
+
+ vg_assert(level < 256); /* arbitrary; stay sane */
+ /* Expand the top level array enough to map this level */
+ while ( VG_(sizeXA)(di->varinfo) <= level ) {
+ inner = VG_(OSetGen_Create)( offsetof(DiAddrRange,aMin),
+ cmp_for_DiAddrRange,
+ dinfo_zalloc, dinfo_free );
+ if (0) VG_(printf)("create: inner = %p, adding at %ld\n",
+ inner, VG_(sizeXA)(di->varinfo));
+ VG_(addToXA)( di->varinfo, &inner );
+ }
+
+ vg_assert( VG_(sizeXA)(di->varinfo) > level );
+ inner = *(OSet**)VG_(indexXA)( di->varinfo, level );
+ vg_assert(inner);
+
+ /* Now we need to find the relevant DiAddrRange within 'inner',
+ or create one if not present. */
+ /* DiAddrRange* */ range = find_or_create_arange( inner, aMin, aMax );
+ /* DiVariable var; */
+ var.name = name;
+ var.typeV = typeV;
+ var.gexprV = gexprV;
+ var.fbGXv = fbGXv;
+ vg_assert(range);
+ vg_assert(range->vars);
+ vg_assert(range->aMin == aMin);
+ VG_(addToXA)( range->vars, &var );
+}
+
+
/*------------------------------------------------------------*/
/*--- Canonicalisers ---*/
/*------------------------------------------------------------*/
@@ -539,7 +672,7 @@
/* Two symbols have the same address. Which name do we prefer?
The general rule is to prefer the shorter symbol name. If the
- symbol contains a '@', which means its versioned, then the length
+ symbol contains a '@', which means it is versioned, then the length
up to the '@' is used for length comparison purposes (so
"foo@GLIBC_2.4.2" is considered shorter than "foobar"), but if two
symbols have the same length, the one with the version string is
@@ -552,6 +685,7 @@
*/
static DiSym* prefersym ( struct _DebugInfo* di, DiSym* a, DiSym* b )
{
+ Int cmp;
Int lena, lenb; /* full length */
Int vlena, vlenb; /* length without version */
const UChar *vpa, *vpb;
@@ -602,12 +736,20 @@
/* Either both versioned or neither is versioned; select them
alphabetically */
- if (VG_(strcmp)(a->name, b->name) < 0) {
+ cmp = VG_(strcmp)(a->name, b->name);
+ if (cmp < 0) {
preferA = True; goto out;
}
- /* else */ {
+ if (cmp > 0) {
preferB = True; goto out;
}
+ /* If we get here, they are the same (?!). That's very odd. In
+ this case we could choose either (arbitrarily), but might as
+ well choose the one with the lowest DiSym* address, so as to try
+ and make the comparison mechanism more stable (a la sorting
+ parlance). Also, skip the diagnostic printing in this case. */
+ return a <= b ? a : b;
+
/*NOTREACHED*/
vg_assert(0);
out:
|
|
From: <sv...@va...> - 2008-02-07 12:05:51
|
Author: sewardj
Date: 2008-02-07 12:05:47 +0000 (Thu, 07 Feb 2008)
New Revision: 7378
Log:
Oops, this is logically part of r7373.
Modified:
branches/DATASYMS/coregrind/m_debuginfo/priv_readdwarf.h
Modified: branches/DATASYMS/coregrind/m_debuginfo/priv_readdwarf.h
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/priv_readdwarf.h 2008-02-07 12:04:25 UTC (rev 7377)
+++ branches/DATASYMS/coregrind/m_debuginfo/priv_readdwarf.h 2008-02-07 12:05:47 UTC (rev 7378)
@@ -39,15 +39,15 @@
/* --------------------
- DWARF2 reader
+ DWARF3 reader
-------------------- */
extern
-void ML_(read_debuginfo_dwarf2)
+void ML_(read_debuginfo_dwarf3)
( struct _DebugInfo* di,
- UChar* debuginfo, Int debug_info_sz, /* .debug_info */
- UChar* debugabbrev, /* .debug_abbrev */
- UChar* debugline, Int debug_line_sz, /* .debug_line */
- UChar* debugstr );
+ UChar* debug_info_img, Word debug_info_sz, /* .debug_info */
+ UChar* debug_abbv_img, Word debug_abbv_sz, /* .debug_abbrev */
+ UChar* debug_line_img, Word debug_line_sz, /* .debug_line */
+ UChar* debug_str_img, Word debug_str_sz ); /* .debug_str */
/* --------------------
DWARF1 reader
|
|
From: <sv...@va...> - 2008-02-07 12:04:25
|
Author: sewardj
Date: 2008-02-07 12:04:25 +0000 (Thu, 07 Feb 2008)
New Revision: 7377
Log:
describe_addr: make use of new function VG_(get_datasym_and_offset),
mostly for the purposes of testing the latter.
Modified:
branches/DATASYMS/memcheck/mc_main.c
Modified: branches/DATASYMS/memcheck/mc_main.c
===================================================================
--- branches/DATASYMS/memcheck/mc_main.c 2008-02-07 12:02:12 UTC (rev 7376)
+++ branches/DATASYMS/memcheck/mc_main.c 2008-02-07 12:04:25 UTC (rev 7377)
@@ -2628,9 +2628,10 @@
enum {
Addr_Undescribed, // as-yet unclassified
Addr_Unknown, // classification yielded nothing useful
+ Addr_Block, // in malloc'd/free'd block
Addr_Stack, // on a thread's stack
- Addr_Block, // in malloc'd/free'd block
- Addr_GlobalData, // in a global data sym
+ Addr_DataSym, // in a global data sym
+ Addr_Variable, // variable described by the debug info
Addr_SectKind // last-ditch classification attempt
}
AddrTag;
@@ -2665,8 +2666,13 @@
struct {
Char name[64];
OffT offset;
- } GlobalData;
+ } DataSym;
+ // Is described by Dwarf debug info. Arbitrary string.
+ struct {
+ Char descr[64];
+ } Variable;
+
// Could only narrow it down to be the PLT/GOT/etc of a given
// object. Better than nothing, perhaps.
struct {
@@ -2850,17 +2856,22 @@
break;
}
- case Addr_GlobalData:
+ case Addr_DataSym:
VG_(message)(Vg_UserMsg,
"%sAddress 0x%llx is %llu bytes "
- "inside global var \"%t\"%s",
+ "inside data symbol \"%t\"%s",
xpre,
(ULong)a,
- (ULong)ai->Addr.GlobalData.offset,
- ai->Addr.GlobalData.name,
+ (ULong)ai->Addr.DataSym.offset,
+ ai->Addr.DataSym.name,
xpost);
break;
+ case Addr_Variable:
+ VG_(message)(Vg_UserMsg,
+ "%s%s%s", xpre, ai->Addr.Variable.descr, xpost);
+ break;
+
case Addr_SectKind:
VG_(message)(Vg_UserMsg,
"%sAddress 0x%llx is in the %t segment of %t%s",
@@ -3359,7 +3370,11 @@
/* Describe an address as best you can, for error messages,
putting the result in ai. */
-static void describe_addr ( Addr a, AddrInfo* ai )
+static void describe_addr ( Addr a,
+ Addr ip_at_error,
+ Addr sp_at_error,
+ Addr fp_at_error,
+ /*OUT*/AddrInfo* ai )
{
MC_Chunk* mc;
ThreadId tid;
@@ -3372,15 +3387,6 @@
if (client_perm_maybe_describe( a, ai )) {
return;
}
- /* Perhaps it's on a thread's stack? */
- VG_(thread_stack_reset_iter)();
- while ( VG_(thread_stack_next)(&tid, &stack_min, &stack_max) ) {
- if (stack_min <= a && a <= stack_max) {
- ai->tag = Addr_Stack;
- ai->Addr.Stack.tid = tid;
- return;
- }
- }
/* Search for a recently freed block which might bracket it. */
mc = MC_(get_freed_list_head)();
while (mc) {
@@ -3408,17 +3414,40 @@
return;
}
}
- /* Perhaps it's in global data? */
- VG_(memset)( &ai->Addr.GlobalData.name, 0, sizeof(ai->Addr.GlobalData.name));
- if (VG_(get_dataname_and_offset)(
- a, &ai->Addr.GlobalData.name[0],
- sizeof(ai->Addr.GlobalData.name)-1,
- &ai->Addr.GlobalData.offset )) {
- ai->tag = Addr_GlobalData;
- tl_assert( ai->Addr.GlobalData.name
- [ sizeof(ai->Addr.GlobalData.name)-1 ] == 0);
+ /* Perhaps the variable type/location data describes it? */
+ VG_(memset)( &ai->Addr.Variable.descr,
+ 0, sizeof(ai->Addr.Variable.descr));
+ if (VG_(get_data_description)(
+ a, ip_at_error, sp_at_error, fp_at_error,
+ &ai->Addr.Variable.descr[0],
+ sizeof(ai->Addr.Variable.descr)-1 )) {
+ ai->tag = Addr_Variable;
+ tl_assert( ai->Addr.Variable.descr
+ [ sizeof(ai->Addr.Variable.descr)-1 ] == 0);
return;
}
+ /* Have a look at the low level data symbols - perhaps it's in
+ there. */
+ VG_(memset)( &ai->Addr.DataSym.name,
+ 0, sizeof(ai->Addr.DataSym.name));
+ if (VG_(get_datasym_and_offset)(
+ a, &ai->Addr.DataSym.name[0],
+ sizeof(ai->Addr.DataSym.name)-1,
+ &ai->Addr.DataSym.offset )) {
+ ai->tag = Addr_DataSym;
+ tl_assert( ai->Addr.DataSym.name
+ [ sizeof(ai->Addr.DataSym.name)-1 ] == 0);
+ return;
+ }
+ /* Perhaps it's on a thread's stack? */
+ VG_(thread_stack_reset_iter)();
+ while ( VG_(thread_stack_next)(&tid, &stack_min, &stack_max) ) {
+ if (stack_min <= a && a <= stack_max) {
+ ai->tag = Addr_Stack;
+ ai->Addr.Stack.tid = tid;
+ return;
+ }
+ }
/* last ditch attempt at classification */
tl_assert( sizeof(ai->Addr.SectKind.objname) > 4 );
VG_(memset)( &ai->Addr.SectKind.objname,
@@ -3443,6 +3472,11 @@
{
MC_Error* extra = VG_(get_error_extra)(err);
+ ThreadId tid = VG_(get_error_tid)(err);
+ Addr ip_at_error = VG_(get_IP)( tid );
+ Addr sp_at_error = VG_(get_SP)( tid );
+ Addr fp_at_error = VG_(get_FP)( tid );
+
switch (VG_(get_error_kind)(err)) {
// These ones don't have addresses associated with them, and so don't
// need any updating.
@@ -3459,22 +3493,33 @@
// These ones always involve a memory address.
case Err_Addr:
- describe_addr ( VG_(get_error_address)(err), &extra->Err.Addr.ai );
+ describe_addr ( VG_(get_error_address)(err),
+ ip_at_error, sp_at_error, fp_at_error,
+ &extra->Err.Addr.ai );
return sizeof(MC_Error);
case Err_MemParam:
- describe_addr ( VG_(get_error_address)(err), &extra->Err.MemParam.ai );
+ describe_addr ( VG_(get_error_address)(err),
+ ip_at_error, sp_at_error, fp_at_error,
+ &extra->Err.MemParam.ai );
return sizeof(MC_Error);
case Err_Jump:
- describe_addr ( VG_(get_error_address)(err), &extra->Err.Jump.ai );
+ describe_addr ( VG_(get_error_address)(err),
+ ip_at_error, sp_at_error, fp_at_error,
+ &extra->Err.Jump.ai );
return sizeof(MC_Error);
case Err_User:
- describe_addr ( VG_(get_error_address)(err), &extra->Err.User.ai );
+ describe_addr ( VG_(get_error_address)(err),
+ ip_at_error, sp_at_error, fp_at_error,
+ &extra->Err.User.ai );
return sizeof(MC_Error);
case Err_Free:
- describe_addr ( VG_(get_error_address)(err), &extra->Err.Free.ai );
+ describe_addr ( VG_(get_error_address)(err),
+ ip_at_error, sp_at_error, fp_at_error,
+ &extra->Err.Free.ai );
return sizeof(MC_Error);
case Err_IllegalMempool:
describe_addr ( VG_(get_error_address)(err),
+ ip_at_error, sp_at_error, fp_at_error,
&extra->Err.IllegalMempool.ai );
return sizeof(MC_Error);
|
|
From: <sv...@va...> - 2008-02-07 12:02:09
|
Author: sewardj
Date: 2008-02-07 12:02:12 +0000 (Thu, 07 Feb 2008)
New Revision: 7376
Log:
* rename VG_(get_dataname_and_offset)
to VG_(get_datasym_and_offset)
* new function VG_(get_data_description), which attempts to
describe a data address based on variable type and location
data stored in the DebugInfo type. In particular should be
able to describe variables on the stack.
Modified:
branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
branches/DATASYMS/include/pub_tool_debuginfo.h
Modified: branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-07 11:58:22 UTC (rev 7375)
+++ branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-07 12:02:12 UTC (rev 7376)
@@ -49,11 +49,13 @@
#include "pub_core_aspacemgr.h"
#include "pub_core_machine.h" // VG_PLAT_USES_PPCTOC
#include "pub_core_xarray.h"
+#include "pub_core_oset.h"
#include "priv_storage.h"
#include "priv_readdwarf.h"
#include "priv_readstabs.h"
#if defined(VGO_linux)
# include "priv_readelf.h"
+# include "priv_readdwarf3.h"
#elif defined(VGO_aix5)
# include "pub_core_debuglog.h"
# include "pub_core_libcproc.h"
@@ -528,6 +530,14 @@
}
if (di->have_rx_map && di->have_rw_map && !di->have_dinfo) {
+
+ vg_assert(di->filename);
+ TRACE_SYMTAB("\n");
+ TRACE_SYMTAB("------ start ELF OBJECT "
+ "------------------------------\n");
+ TRACE_SYMTAB("------ name = %s\n", di->filename);
+ TRACE_SYMTAB("\n");
+
/* We're going to read symbols and debug info for the vma ranges
[rx_map_avma,+rx_map_size) and [rw_map_avma,+rw_map_size).
First get rid of any other DebugInfos which overlap either of
@@ -538,18 +548,28 @@
ok = ML_(read_elf_debug_info)( di );
if (ok) {
+ TRACE_SYMTAB("\n------ Canonicalising the "
+ "acquired info ------\n");
/* prepare read data for use */
ML_(canonicaliseTables)( di );
/* notify m_redir about it */
+ TRACE_SYMTAB("\n------ Notifying m_redir ------\n");
VG_(redir_notify_new_DebugInfo)( di );
/* Note that we succeeded */
di->have_dinfo = True;
} else {
+ TRACE_SYMTAB("\n------ ELF reading failed ------\n");
/* Something went wrong (eg. bad ELF file). Should we delete
this DebugInfo? No - it contains info on the rw/rx
mappings, at least. */
}
+ TRACE_SYMTAB("\n");
+ TRACE_SYMTAB("------ name = %s\n", di->filename);
+ TRACE_SYMTAB("------ end ELF OBJECT "
+ "------------------------------\n");
+ TRACE_SYMTAB("\n");
+
}
}
@@ -694,7 +714,8 @@
}
/* Note this short-circuit check relies on the assumption that
- .bss is mapped immediately after .data. */
+ .bss is mapped immediately after .data. This is an assumption
+ that readelf.c makes anyway. */
if (!inRange) continue;
sno = ML_(search_one_symtab) (
@@ -870,17 +891,17 @@
# undef N_TMPBUF
}
-/* Looks up 'a' in the collection of data symbols, and if found puts
- its name (or as much as will fit) into dname[0 .. n_dname-1]
- including zero terminator. Also the 'a's offset from the symbol
- start is put into *offset. */
-Bool VG_(get_dataname_and_offset)( Addr a,
- /*OUT*/Char* dname, Int n_dname,
- /*OUT*/OffT* offset )
+/* Looks up data_addr in the collection of data symbols, and if found
+ puts its name (or as much as will fit) into dname[0 .. n_dname-1],
+ which is guaranteed to be zero terminated. Also data_addr's offset
+ from the symbol start is put into *offset. */
+Bool VG_(get_datasym_and_offset)( Addr data_addr,
+ /*OUT*/Char* dname, Int n_dname,
+ /*OUT*/OffT* offset )
{
Bool ok;
vg_assert(n_dname > 1);
- ok = get_sym_name ( /*demangle*/False, a, dname, n_dname,
+ ok = get_sym_name ( /*demangle*/False, data_addr, dname, n_dname,
/*match_anywhere_in_sym*/True,
/*show offset?*/False,
/*data syms only please*/False,
@@ -891,7 +912,184 @@
return True;
}
+/* Try to form some description of data_addr by looking at the DWARF3
+ debug info we have. This only looks at stack locations (for the
+ top frame of the thread from which ip/sp/fp are taken) and at
+ global variables. Result (or as much as will fit) is put into into
+ dname[0 .. n_dname-1] and is guaranteed to be zero terminated. */
+/* Evaluate the location expression/list for var, to see whether or
+ not data_addr falls within the variable. If so also return the
+ offset of data_addr from the start of the variable.*/
+static Bool data_address_is_in_var ( /*OUT*/UWord* offset,
+ DiVariable* var,
+ RegSummary* regs,
+ Addr data_addr )
+{
+ SizeT var_szB;
+ GXResult res;
+ vg_assert(var->name);
+ vg_assert(var->typeV);
+ vg_assert(var->gexprV);
+ var_szB = ML_(sizeOfD3Type)(var->typeV);
+
+ if (1) {
+ VG_(printf)("VVVV: find loc: %s :: ", var->name );
+ ML_(pp_D3Type_C_ishly)( var->typeV );
+ VG_(printf)("\n");
+ }
+
+ res = ML_(evaluate_GX)( var->gexprV, var->fbGXv, regs );
+
+ if (1) VG_(printf)("VVVV: -> 0x%lx %s\n", res.res,
+ res.failure ? res.failure : "(success)");
+ if (!res.failure && res.res <= data_addr
+ && data_addr < res.res + var_szB) {
+ *offset = res.res - data_addr;
+ return True;
+ } else {
+ return False;
+ }
+}
+Bool VG_(get_data_description)( Addr data_addr,
+ Addr ip, Addr sp, Addr fp,
+ /*OUT*/Char* dname, Int n_dname )
+{
+ DebugInfo* di;
+ RegSummary regs;
+ DebugInfo* di_for_ip;
+
+ vg_assert(n_dname > 1);
+ dname[n_dname-1] = 0;
+
+ if (0) VG_(printf)("GDnO: dataaddr %p, ip at error %p\n",
+ data_addr, ip );
+
+ /* Loop over the DebugInfos we have. Check data_addr against the
+ outermost scope of all of them (as that should be a global
+ scope). Also, identify the di which contains the PC address.
+ That will be the one in which we need to look to find info on
+ nested scopes. */
+
+ regs.ip = ip;
+ regs.sp = sp;
+ regs.fp = fp;
+
+ di_for_ip = NULL;
+ for (di = debugInfo_list; di != NULL; di = di->next) {
+ OSet* global_scope;
+ Int gs_size;
+ Addr zero;
+ DiAddrRange* global_arange;
+ Word i;
+ XArray* vars;
+
+ /* text segment missing? unlikely, but handle it .. */
+ if (di->text_size == 0)
+ continue;
+ /* Ok. So does this text mapping bracket the ip? */
+ if (di->text_avma <= ip && ip < di->text_avma + di->text_size)
+ di_for_ip = di;
+ /* any var info at all? */
+ if (!di->varinfo)
+ continue;
+ /* perhaps this object didn't contribute any vars at all? */
+ if (VG_(sizeXA)( di->varinfo ) == 0)
+ continue;
+ global_scope = *(OSet**)VG_(indexXA)( di->varinfo, 0 );
+ vg_assert(global_scope);
+ gs_size = VG_(OSetGen_Size)( global_scope );
+ /* The global scope might be completely empty if this
+ compilation unit declared locals but nothing global. */
+ if (gs_size == 0)
+ continue;
+ /* But if it isn't empty, then it must contain exactly one
+ element, which covers the entire address range. */
+ vg_assert(gs_size == 1);
+ /* Fish out the global scope and check it is as expected. */
+ zero = 0;
+ global_arange
+ = VG_(OSetGen_Lookup)( global_scope, &zero );
+ /* The global range from (Addr)0 to ~(Addr)0 must exist */
+ vg_assert(global_arange);
+ vg_assert(global_arange->aMin == (Addr)0);
+ vg_assert(global_arange->aMax == ~(Addr)0);
+ /* Any vars in this range? */
+ if (!global_arange->vars)
+ continue;
+ /* Ok, there are some vars in the global scope of this
+ DebugInfo. Wade through them and see if the data addresses
+ of any of them bracket data_addr. */
+ vars = global_arange->vars;
+ for (i = 0; i < VG_(sizeXA)( vars ); i++) {
+ SizeT offset;
+ DiVariable* var = (DiVariable*)VG_(indexXA)( vars, i );
+ vg_assert(var->name);
+ if (data_address_is_in_var( &offset, var, ®s, data_addr )) {
+ VG_(snprintf)(
+ dname, (SizeT)n_dname,
+ "Address 0x%lx is %lu bytes inside global var \"%s\"",
+ data_addr, offset, var->name);
+ dname[n_dname-1] = 0;
+ return True;
+ }
+ }
+ }
+
+ if (0) {
+ VG_(printf)("di_for_ip %p\n", di_for_ip);
+ VG_(printf)("vi %p\n", di_for_ip->varinfo);
+ VG_(printf)("vi size %d\n", (Int)VG_(sizeXA)(di_for_ip->varinfo));
+ }
+
+ /* Now that we've considered all the globals in scope, consider the
+ locals. */
+ if (di_for_ip && di_for_ip->varinfo) {
+ Word i;
+ /* Work through the scopes from most deeply nested outwards,
+ looking for code address ranges that bracket 'ip'. The
+ variables on each such address range found are in scope right
+ now. Don't descend to level zero as that is the global
+ scope. */
+ /* "for each scope, working outwards ..." */
+ for (i = VG_(sizeXA)(di_for_ip->varinfo) - 1; i >= 1; i--) {
+ XArray* vars;
+ Word j;
+ DiAddrRange* arange;
+ OSet* this_scope
+ = *(OSet**)VG_(indexXA)( di_for_ip->varinfo, i );
+ if (!this_scope)
+ continue;
+ /* Find the set of variables in this scope that
+ bracket the program counter. */
+ arange = VG_(OSetGen_LookupWithCmp)(
+ this_scope, &ip,
+ ML_(cmp_for_DiAddrRange_range)
+ );
+ if (!arange)
+ continue;
+ vg_assert(arange->aMin <= ip && ip <= arange->aMax);
+ vars = arange->vars;
+ for (j = 0; j < VG_(sizeXA)( vars ); j++) {
+ DiVariable* var = (DiVariable*)VG_(indexXA)( vars, j );
+ SizeT offset;
+ if (data_address_is_in_var( &offset, var, ®s, data_addr )) {
+ VG_(snprintf)(
+ dname, (SizeT)n_dname,
+ "Address 0x%lx is %lu bytes inside local var \"%s\"",
+ data_addr, offset, var->name);
+ dname[n_dname-1] = 0;
+ return True;
+ }
+ }
+ }
+ }
+
+ /* We didn't find anything useful. */
+ return False;
+}
+
+
/* Map a code address to the name of a shared object file or the
executable. Returns False if no idea; otherwise True. Doesn't
require debug info. Caller supplies buf and nbuf. */
@@ -1322,7 +1520,7 @@
n_steps++;
/* Use the per-DebugInfo summary address ranges to skip
- inapplicable DebugInfos quickly. */
+ inapplicable DebugInfos quickly. */
if (si->cfsi_used == 0)
continue;
if (*ipP < si->cfsi_minaddr || *ipP > si->cfsi_maxaddr)
Modified: branches/DATASYMS/include/pub_tool_debuginfo.h
===================================================================
--- branches/DATASYMS/include/pub_tool_debuginfo.h 2008-02-07 11:58:22 UTC (rev 7375)
+++ branches/DATASYMS/include/pub_tool_debuginfo.h 2008-02-07 12:02:12 UTC (rev 7376)
@@ -74,17 +74,26 @@
entry points within it. */
extern Bool VG_(get_fnname_if_entry) ( Addr a, Char* fnname, Int n_fnname );
-/* Looks up 'a' in the collection of data symbols, and if found puts
- its name (or as much as will fit) into dname[0 .. n_dname-1]
- including zero terminator. Also the 'a's offset from the symbol
- start is put into *offset. */
-extern Bool VG_(get_dataname_and_offset)( Addr a,
- /*OUT*/Char* dname, Int n_dname,
- /*OUT*/OffT* offset );
+/* Looks up data_addr in the collection of data symbols, and if found
+ puts its name (or as much as will fit) into dname[0 .. n_dname-1],
+ which is guaranteed to be zero terminated. Also data_addr's offset
+ from the symbol start is put into *offset. */
+extern Bool VG_(get_datasym_and_offset)( Addr data_addr,
+ /*OUT*/Char* dname, Int n_dname,
+ /*OUT*/OffT* offset );
+/* Try to form some description of data_addr by looking at the DWARF3
+ debug info we have. This only looks at stack locations (for the
+ top frame of the thread from which ip/sp/fp are taken) and at
+ global variables. Result (or as much as will fit) is put into into
+ dname[0 .. n_dname-1] and is guaranteed to be zero terminated. */
+extern Bool VG_(get_data_description)( Addr data_addr,
+ Addr ip, Addr sp, Addr fp,
+ /*OUT*/Char* dname, Int n_dname );
+
/* Succeeds if the address is within a shared object or the main executable.
It doesn't matter if debug info is present or not. */
-extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
+extern Bool VG_(get_objname) ( Addr a, Char* objname, Int n_objname );
/* Puts into 'buf' info about the code address %eip: the address, function
name (if known) and filename/line number (if known), like this:
|
|
From: <sv...@va...> - 2008-02-07 11:58:19
|
Author: sewardj
Date: 2008-02-07 11:58:22 +0000 (Thu, 07 Feb 2008)
New Revision: 7375
Log:
Allow tools to extract the ThreadId associated with an Error, so they
can then enquire as to the IP/SP/FP at error, which are necessary for
building better source-level descriptions of data addresses.
Modified:
branches/DATASYMS/coregrind/m_errormgr.c
branches/DATASYMS/include/pub_tool_errormgr.h
Modified: branches/DATASYMS/coregrind/m_errormgr.c
===================================================================
--- branches/DATASYMS/coregrind/m_errormgr.c 2008-02-07 11:53:55 UTC (rev 7374)
+++ branches/DATASYMS/coregrind/m_errormgr.c 2008-02-07 11:58:22 UTC (rev 7375)
@@ -119,9 +119,9 @@
// NULL if unsuppressed; or ptr to suppression record.
Supp* supp;
Int count;
- ThreadId tid;
// The tool-specific part
+ ThreadId tid; // Initialised by core
ExeContext* where; // Initialised by core
ErrorKind ekind; // Used by ALL. Must be in the range (0..)
Addr addr; // Used frequently
@@ -129,6 +129,17 @@
void* extra; // For any tool-specific extras
};
+
+
+/* Note, VG_(get_error_tid) only produces a meaningful result at the
+ time that the error is handed to VG_(maybe_record_error), since the
+ same tid may be reassigned later to a new thread. Caveat
+ Caller. */
+ThreadId VG_(get_error_tid) ( Error* err )
+{
+ return err->tid;
+}
+
ExeContext* VG_(get_error_where) ( Error* err )
{
return err->where;
Modified: branches/DATASYMS/include/pub_tool_errormgr.h
===================================================================
--- branches/DATASYMS/include/pub_tool_errormgr.h 2008-02-07 11:53:55 UTC (rev 7374)
+++ branches/DATASYMS/include/pub_tool_errormgr.h 2008-02-07 11:58:22 UTC (rev 7375)
@@ -55,7 +55,11 @@
Error;
/* Useful in VG_(tdict).tool_error_matches_suppression(),
- * VG_(tdict).tool_pp_Error(), etc */
+ * VG_(tdict).tool_pp_Error(), etc. Note, VG_(get_error_tid) only
+ produces a meaningful result at the time that the error is
+ handed to VG_(maybe_record_error), since the same tid may be
+ reassigned later to a new thread. Caveat Caller. */
+ThreadId VG_(get_error_tid) ( Error* err );
ExeContext* VG_(get_error_where) ( Error* err );
ErrorKind VG_(get_error_kind) ( Error* err );
Addr VG_(get_error_address) ( Error* err );
|
|
From: <sv...@va...> - 2008-02-07 11:53:51
|
Author: sewardj
Date: 2008-02-07 11:53:55 +0000 (Thu, 07 Feb 2008)
New Revision: 7374
Log:
* Improve debug printing
* Find more flavours of Dwarf sections, and hand them off to
the new .debug_info reader
Modified:
branches/DATASYMS/coregrind/m_debuginfo/readelf.c
Modified: branches/DATASYMS/coregrind/m_debuginfo/readelf.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readelf.c 2008-02-07 11:51:29 UTC (rev 7373)
+++ branches/DATASYMS/coregrind/m_debuginfo/readelf.c 2008-02-07 11:53:55 UTC (rev 7374)
@@ -50,6 +50,7 @@
#include "priv_storage.h"
#include "priv_readelf.h" /* self */
#include "priv_readdwarf.h" /* 'cos ELF contains DWARF */
+#include "priv_readdwarf3.h"
#include "priv_readstabs.h" /* and stabs, if we're unlucky */
/* --- !!! --- EXTERNAL HEADERS start --- !!! --- */
@@ -503,7 +504,7 @@
return;
}
- TRACE_SYMTAB("\n--- Reading (ELF, standard) %s (%d entries)---\n",
+ TRACE_SYMTAB("\n--- Reading (ELF, standard) %s (%d entries) ---\n",
tab_name, symtab_szB/sizeof(ElfXX_Sym) );
/* Perhaps should start at i = 1; ELF docs suggest that entry
@@ -1102,12 +1103,7 @@
shdr_nent = ehdr_img->e_shnum;
shdr_ent_szB = ehdr_img->e_shentsize;
- TRACE_SYMTAB("\n");
- TRACE_SYMTAB("------ start ELF OBJECT ------------------------------\n");
- TRACE_SYMTAB("------ name = %s\n", di->filename);
- TRACE_SYMTAB("\n");
-
- TRACE_SYMTAB("--- Basic facts about the object ---\n");
+ TRACE_SYMTAB("------ Basic facts about the object ------\n");
TRACE_SYMTAB("object: img %p n_oimage %ld\n",
(void*)oimage, n_oimage);
TRACE_SYMTAB("phdr: img %p nent %ld ent_szB %ld\n",
@@ -1151,7 +1147,7 @@
this object. Apparently requires looking through the program
header table. */
TRACE_SYMTAB("\n");
- TRACE_SYMTAB("--- Looking for the soname ---\n");
+ TRACE_SYMTAB("------ Looking for the soname ------\n");
vg_assert(di->soname == NULL);
{
ElfXX_Addr prev_svma = 0;
@@ -1278,7 +1274,8 @@
/* Now read the section table. */
TRACE_SYMTAB("\n");
- TRACE_SYMTAB("--- Examining the section headers and program headers ---\n");
+ TRACE_SYMTAB("------ Examining the section headers "
+ "and program headers ------\n");
TRACE_SYMTAB("rx: foffsets %ld .. %ld\n",
di->rx_map_foff, di->rx_map_foff + di->rx_map_size - 1 );
TRACE_SYMTAB("rw: foffsets %ld .. %ld\n",
@@ -1602,7 +1599,8 @@
di->text_avma );
TRACE_SYMTAB("\n");
- TRACE_SYMTAB("--- Finding image addresses for debug-info sections ---\n");
+ TRACE_SYMTAB("------ Finding image addresses "
+ "for debug-info sections ------\n");
/* Find interesting sections, read the symbol table(s), read any debug
information */
@@ -1610,22 +1608,24 @@
/* IMAGE addresses: pointers to start of sections in the
transiently loaded oimage, not in the fragments of the file
mapped in by the guest's dynamic linker. */
- UChar* strtab_img = NULL; /* .strtab */
- ElfXX_Sym* symtab_img = NULL; /* .symtab */
- UChar* dynstr_img = NULL; /* .dynstr */
- ElfXX_Sym* dynsym_img = NULL; /* .dynsym */
- UChar* debuglink_img = NULL; /* .gnu_debuglink */
- UChar* stab_img = NULL; /* .stab (stabs) */
- UChar* stabstr_img = NULL; /* .stabstr (stabs) */
- UChar* debug_line_img = NULL; /* .debug_line (dwarf2) */
- UChar* debug_info_img = NULL; /* .debug_info (dwarf2) */
- UChar* debug_abbv_img = NULL; /* .debug_abbrev (dwarf2) */
- UChar* debug_str_img = NULL; /* .debug_str (dwarf2) */
- UChar* dwarf1d_img = NULL; /* .debug (dwarf1) */
- UChar* dwarf1l_img = NULL; /* .line (dwarf1) */
- UChar* ehframe_img = NULL; /* .eh_frame (dwarf2) */
- UChar* opd_img = NULL; /* .opd (dwarf2, ppc64-linux) */
-
+ UChar* strtab_img = NULL; /* .strtab */
+ ElfXX_Sym* symtab_img = NULL; /* .symtab */
+ UChar* dynstr_img = NULL; /* .dynstr */
+ ElfXX_Sym* dynsym_img = NULL; /* .dynsym */
+ UChar* debuglink_img = NULL; /* .gnu_debuglink */
+ UChar* stab_img = NULL; /* .stab (stabs) */
+ UChar* stabstr_img = NULL; /* .stabstr (stabs) */
+ UChar* debug_line_img = NULL; /* .debug_line (dwarf2) */
+ UChar* debug_info_img = NULL; /* .debug_info (dwarf2) */
+ UChar* debug_abbv_img = NULL; /* .debug_abbrev (dwarf2) */
+ UChar* debug_str_img = NULL; /* .debug_str (dwarf2) */
+ UChar* debug_ranges_img = NULL; /* .debug_ranges (dwarf2) */
+ UChar* debug_loc_img = NULL; /* .debug_loc (dwarf2) */
+ UChar* dwarf1d_img = NULL; /* .debug (dwarf1) */
+ UChar* dwarf1l_img = NULL; /* .line (dwarf1) */
+ UChar* ehframe_img = NULL; /* .eh_frame (dwarf2) */
+ UChar* opd_img = NULL; /* .opd (dwarf2,
+ ppc64-linux) */
/* Section sizes, in bytes */
SizeT strtab_sz = 0;
SizeT symtab_sz = 0;
@@ -1638,6 +1638,8 @@
SizeT debug_info_sz = 0;
SizeT debug_abbv_sz = 0;
SizeT debug_str_sz = 0;
+ SizeT debug_ranges_sz = 0;
+ SizeT debug_loc_sz = 0;
SizeT dwarf1d_sz = 0;
SizeT dwarf1l_sz = 0;
SizeT ehframe_sz = 0;
@@ -1678,27 +1680,29 @@
} \
} while (0);
- /* NAME SIZE IMAGE addr */
- FIND(".dynsym", dynsym_sz, dynsym_img)
- FIND(".dynstr", dynstr_sz, dynstr_img)
- FIND(".symtab", symtab_sz, symtab_img)
- FIND(".strtab", strtab_sz, strtab_img)
+ /* NAME SIZE IMAGE addr */
+ FIND(".dynsym", dynsym_sz, dynsym_img)
+ FIND(".dynstr", dynstr_sz, dynstr_img)
+ FIND(".symtab", symtab_sz, symtab_img)
+ FIND(".strtab", strtab_sz, strtab_img)
- FIND(".gnu_debuglink", debuglink_sz, debuglink_img)
+ FIND(".gnu_debuglink", debuglink_sz, debuglink_img)
- FIND(".stab", stab_sz, stab_img)
- FIND(".stabstr", stabstr_sz, stabstr_img)
+ FIND(".stab", stab_sz, stab_img)
+ FIND(".stabstr", stabstr_sz, stabstr_img)
- FIND(".debug_line", debug_line_sz, debug_line_img)
- FIND(".debug_info", debug_info_sz, debug_info_img)
- FIND(".debug_abbrev", debug_abbv_sz, debug_abbv_img)
- FIND(".debug_str", debug_str_sz, debug_str_img)
+ FIND(".debug_line", debug_line_sz, debug_line_img)
+ FIND(".debug_info", debug_info_sz, debug_info_img)
+ FIND(".debug_abbrev", debug_abbv_sz, debug_abbv_img)
+ FIND(".debug_str", debug_str_sz, debug_str_img)
+ FIND(".debug_ranges", debug_ranges_sz, debug_ranges_img)
+ FIND(".debug_loc", debug_loc_sz, debug_loc_img)
- FIND(".debug", dwarf1d_sz, dwarf1d_img)
- FIND(".line", dwarf1l_sz, dwarf1l_img)
- FIND(".eh_frame", ehframe_sz, ehframe_img)
+ FIND(".debug", dwarf1d_sz, dwarf1d_img)
+ FIND(".line", dwarf1l_sz, dwarf1l_img)
+ FIND(".eh_frame", ehframe_sz, ehframe_img)
- FIND(".opd", opd_sz_unused, opd_img)
+ FIND(".opd", opd_sz_unused, opd_img)
# undef FIND
}
@@ -1832,6 +1836,9 @@
FIND(need_dwarf2, ".debug_info", debug_info_sz, debug_info_img)
FIND(need_dwarf2, ".debug_abbrev", debug_abbv_sz, debug_abbv_img)
FIND(need_dwarf2, ".debug_str", debug_str_sz, debug_str_img)
+ FIND(need_dwarf2, ".debug_ranges", debug_ranges_sz,
+ debug_ranges_img)
+ FIND(need_dwarf2, ".debug_str", debug_loc_sz, debug_loc_img)
FIND(need_dwarf1, ".debug", dwarf1d_sz, dwarf1d_img)
FIND(need_dwarf1, ".line", dwarf1l_sz, dwarf1l_img)
@@ -1888,11 +1895,24 @@
before using it. */
if (debug_info_img && debug_abbv_img && debug_line_img
/* && debug_str_img */) {
- ML_(read_debuginfo_dwarf2) ( di,
- debug_info_img, debug_info_sz,
- debug_abbv_img,
- debug_line_img, debug_line_sz,
- debug_str_img );
+
+ /* The old reader: line numbers and unwind info only */
+ ML_(read_debuginfo_dwarf3) ( di,
+ debug_info_img, debug_info_sz,
+ debug_abbv_img, debug_abbv_sz,
+ debug_line_img, debug_line_sz,
+ debug_str_img, debug_str_sz );
+
+ /* The new reader: read the DIEs in .debug_info to acquire
+ information on variable types and locations. */
+ ML_(new_dwarf3_reader) ( di,
+ debug_info_img, debug_info_sz,
+ debug_abbv_img, debug_abbv_sz,
+ debug_line_img, debug_line_sz,
+ debug_str_img, debug_str_sz,
+ debug_ranges_img, debug_ranges_sz,
+ debug_loc_img, debug_loc_sz );
+
}
if (dwarf1d_img && dwarf1l_img) {
ML_(read_debuginfo_dwarf1) ( di, dwarf1d_img, dwarf1d_sz,
@@ -1904,11 +1924,6 @@
out: {
SysRes m_res;
- TRACE_SYMTAB("\n");
- TRACE_SYMTAB("------ name = %s\n", di->filename);
- TRACE_SYMTAB("------ end ELF OBJECT ------------------------------\n");
- TRACE_SYMTAB("\n");
-
/* Last, but not least, heave the image(s) back overboard. */
if (dimage) {
m_res = VG_(am_munmap_valgrind) ( dimage, n_dimage );
|
|
From: <sv...@va...> - 2008-02-07 11:51:26
|
Author: sewardj
Date: 2008-02-07 11:51:29 +0000 (Thu, 07 Feb 2008)
New Revision: 7373
Log:
Minor changes:
* make read_leb128 be exactly in accordance with the Dwarf3 spec
* fix some terminology in the line number reader (non-functional
change)
Modified:
branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c
Modified: branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c 2008-02-07 11:48:24 UTC (rev 7372)
+++ branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c 2008-02-07 11:51:29 UTC (rev 7373)
@@ -203,6 +203,7 @@
} LineSMR;
+/* FIXME: duplicated in readdwarf3.c */
static
ULong read_leb128 ( UChar* data, Int* length_return, Int sign )
{
@@ -229,7 +230,7 @@
* length_return = num_read;
if (sign && (shift < 64) && (byte & 0x40))
- result |= (-1ULL) << shift;
+ result |= -(1ULL << shift);
return result;
}
@@ -237,6 +238,7 @@
/* Small helper functions easier to use
* value is returned and the given pointer is
* moved past end of leb128 data */
+/* FIXME: duplicated in readdwarf3.c */
static ULong read_leb128U( UChar **data )
{
Int len;
@@ -246,6 +248,7 @@
}
/* Same for signed data */
+/* FIXME: duplicated in readdwarf3.c */
static Long read_leb128S( UChar **data )
{
Int len;
@@ -1112,28 +1115,30 @@
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
-
-/* Collect the debug info from dwarf2 debugging sections
+/* Collect the debug info from DWARF3 debugging sections
* of a given module.
*
* Inputs: given .debug_xxx sections
- * Output: update si to contain all the dwarf2 debug infos
+ * Output: update di to contain all the DWARF3 debug infos
*/
-void ML_(read_debuginfo_dwarf2)
+void ML_(read_debuginfo_dwarf3)
( struct _DebugInfo* di,
- UChar* debuginfo_img, Int debug_info_sz, /* .debug_info */
- UChar* debugabbrev_img, /* .debug_abbrev */
- UChar* debugline_img, Int debug_line_sz, /* .debug_line */
- UChar* debugstr_img ) /* .debug_str */
+ UChar* debug_info_img, Word debug_info_sz, /* .debug_info */
+ UChar* debug_abbv_img, Word debug_abbv_sz, /* .debug_abbrev */
+ UChar* debug_line_img, Word debug_line_sz, /* .debug_line */
+ UChar* debug_str_img, Word debug_str_sz ) /* .debug_str */
{
UnitInfo ui;
UShort ver;
UChar* block_img;
- UChar* end_img = debuginfo_img + debug_info_sz;
+ UChar* end1_img;
ULong blklen;
Bool blklen_is_64;
- Int blklen_len = 0;
+ Int blklen_len;
+ end1_img = debug_info_img + debug_info_sz;
+ blklen_len = 0;
+
/* Make sure we at least have a header for the first block */
if (debug_info_sz < 4) {
ML_(symerr)( di, True,
@@ -1142,15 +1147,16 @@
}
/* Iterate on all the blocks we find in .debug_info */
- for ( block_img = debuginfo_img; block_img < end_img - 4;
- block_img += blklen + blklen_len ) {
+ for ( block_img = debug_info_img;
+ block_img < end1_img - 4;
+ block_img += blklen + blklen_len ) {
/* Read the compilation unit header in .debug_info section - See
p 70 */
/* This block length */
blklen = read_initial_length_field( block_img, &blklen_is_64 );
blklen_len = blklen_is_64 ? 12 : 4;
- if ( block_img + blklen + blklen_len > end_img ) {
+ if ( block_img + blklen + blklen_len > end1_img ) {
ML_(symerr)( di, True,
"Last block truncated in .debug_info; ignoring" );
return;
@@ -1167,8 +1173,9 @@
/* Fill ui with offset in .debug_line and compdir */
if (0)
VG_(printf)( "Reading UnitInfo at 0x%x.....\n",
- block_img - debuginfo_img );
- read_unitinfo_dwarf2( &ui, block_img, debugabbrev_img, debugstr_img, di );
+ block_img - debug_info_img );
+ read_unitinfo_dwarf2( &ui, block_img,
+ debug_abbv_img, debug_str_img, di );
if (0)
VG_(printf)( " => LINES=0x%llx NAME=%s DIR=%s\n",
ui.stmt_list, ui.name, ui.compdir );
@@ -1182,8 +1189,8 @@
debug_line_sz, ui.stmt_list, ui.name );
/* Read the .debug_line block for this compile unit */
read_dwarf2_lineblock(
- di, &ui, debugline_img + ui.stmt_list,
- debug_line_sz - ui.stmt_list );
+ di, &ui, debug_line_img + ui.stmt_list,
+ debug_line_sz - ui.stmt_list );
}
}
@@ -1778,7 +1785,7 @@
# define SP_REG 1
# define RA_REG_DEFAULT 8 // CAB: What's a good default ?
#else
-# error Unknown platform
+# error "Unknown platform"
#endif
/* the number of regs we are prepared to unwind */
|
|
From: <sv...@va...> - 2008-02-07 11:48:22
|
Author: sewardj
Date: 2008-02-07 11:48:24 +0000 (Thu, 07 Feb 2008)
New Revision: 7372
Log:
Be somewhat more efficient when the element type is very small (eg char).
Modified:
branches/DATASYMS/coregrind/m_xarray.c
Modified: branches/DATASYMS/coregrind/m_xarray.c
===================================================================
--- branches/DATASYMS/coregrind/m_xarray.c 2008-02-05 20:07:23 UTC (rev 7371)
+++ branches/DATASYMS/coregrind/m_xarray.c 2008-02-07 11:48:24 UTC (rev 7372)
@@ -118,7 +118,18 @@
vg_assert(!xa->arr);
if (xa->totsizeE > 0)
vg_assert(xa->arr);
- newsz = xa->totsizeE==0 ? 2 : 2 * xa->totsizeE;
+ if (xa->totsizeE == 0) {
+ /* No point in having tiny (eg) 2-byte allocations for the
+ element array, since all allocs are rounded up to 8 anyway.
+ Hence increase the initial array size for tiny elements in
+ an attempt to avoid reallocations of size 2, 4, 8 if the
+ array does start to fill up. */
+ if (xa->elemSzB == 1) newsz = 8;
+ else if (xa->elemSzB == 2) newsz = 4;
+ else newsz = 2;
+ } else {
+ newsz = 2 * xa->totsizeE;
+ }
if (0)
VG_(printf)("addToXA: increasing from %ld to %ld\n",
xa->totsizeE, newsz);
@@ -133,8 +144,13 @@
}
vg_assert(xa->usedsizeE < xa->totsizeE);
vg_assert(xa->arr);
- VG_(memcpy)( ((UChar*)xa->arr) + xa->usedsizeE * xa->elemSzB,
- elem, xa->elemSzB );
+ if (xa->elemSzB == 1) {
+ /* calling memcpy is just stupid, hence */
+ * (((UChar*)xa->arr) + xa->usedsizeE) = * ((UChar*) elem);
+ } else {
+ VG_(memcpy)( ((UChar*)xa->arr) + xa->usedsizeE * xa->elemSzB,
+ elem, xa->elemSzB );
+ }
xa->usedsizeE++;
xa->sorted = False;
return xa->usedsizeE-1;
|
|
From: John R.
|
Hello Konstantin, >>My patches for valgrind to support UserModeLinux implemented >>a CLONE_CHILD_LETGO flag meaning, "do not virtualize the child; >>let it run natively free." This happened to be a good idea for UML. > May I ask you to send me this patch? > If I understood you correctly, I need something similar for CLONE_UNTRACED. http://bitwagon.com/valgrind+uml/ http://bitwagon.com/valgrind+uml/vg330-patches-jreiser0127.tgz -- John Reiser, jreiser@BitWagon.com |
|
From: Tom H. <th...@cy...> - 2008-02-07 04:06:43
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2008-02-07 03:15:02 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 339 tests, 84 stderr failures, 1 stdout failure, 29 post failures == memcheck/tests/addressable (stderr) memcheck/tests/badjump (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/erringfds (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-pool-0 (stderr) memcheck/tests/leak-pool-1 (stderr) memcheck/tests/leak-pool-2 (stderr) memcheck/tests/leak-pool-3 (stderr) memcheck/tests/leak-pool-4 (stderr) memcheck/tests/leak-pool-5 (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/long_namespace_xml (stderr) memcheck/tests/lsframe1 (stderr) memcheck/tests/lsframe2 (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/noisy_child (stderr) memcheck/tests/partial_load_dflt (stderr) memcheck/tests/partial_load_ok (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/stack_changes (stderr) memcheck/tests/supp_unknown (stderr) memcheck/tests/x86/bug152022 (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/xor-undef-x86 (stderr) memcheck/tests/xml1 (stderr) massif/tests/alloc-fns-A (post) massif/tests/alloc-fns-B (post) massif/tests/basic (post) massif/tests/basic2 (post) massif/tests/big-alloc (post) massif/tests/culling1 (stderr) massif/tests/culling2 (stderr) massif/tests/custom_alloc (post) massif/tests/deep-A (post) massif/tests/deep-B (stderr) massif/tests/deep-B (post) massif/tests/deep-C (stderr) massif/tests/deep-C (post) massif/tests/deep-D (post) massif/tests/ignoring (post) massif/tests/insig (post) massif/tests/long-names (post) massif/tests/long-time (post) massif/tests/new-cpp (post) massif/tests/null (post) massif/tests/one (post) massif/tests/overloaded-new (post) massif/tests/peak (post) massif/tests/peak2 (stderr) massif/tests/peak2 (post) massif/tests/realloc (stderr) massif/tests/realloc (post) massif/tests/thresholds_0_0 (post) massif/tests/thresholds_0_10 (post) massif/tests/thresholds_10_0 (post) massif/tests/thresholds_10_10 (post) massif/tests/thresholds_5_0 (post) massif/tests/thresholds_5_10 (post) massif/tests/zero1 (post) massif/tests/zero2 (post) none/tests/blockfault (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/hg01_all_ok (stderr) helgrind/tests/hg02_deadlock (stderr) helgrind/tests/hg03_inherit (stderr) helgrind/tests/hg04_race (stderr) helgrind/tests/hg05_race2 (stderr) helgrind/tests/hg06_readshared (stderr) helgrind/tests/tc01_simple_race (stderr) helgrind/tests/tc02_simple_tls (stderr) helgrind/tests/tc03_re_excl (stderr) helgrind/tests/tc04_free_lock (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc07_hbl1 (stderr) helgrind/tests/tc08_hbl2 (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc10_rec_lock (stderr) helgrind/tests/tc11_XCHG (stderr) helgrind/tests/tc12_rwl_trivial (stderr) helgrind/tests/tc13_laog1 (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc19_shadowmem (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) helgrind/tests/tc23_bogus_condwait (stderr) helgrind/tests/tc24_nonzero_sem (stderr) exp-drd/tests/fp_race (stderr) exp-drd/tests/fp_race2 (stderr) exp-drd/tests/matinv (stderr) exp-drd/tests/pth_barrier (stderr) exp-drd/tests/pth_broadcast (stderr) exp-drd/tests/pth_cond_race (stderr) exp-drd/tests/pth_cond_race2 (stderr) exp-drd/tests/pth_create_chain (stderr) exp-drd/tests/pth_detached (stderr) exp-drd/tests/pth_detached2 (stderr) exp-drd/tests/sem_as_mutex (stderr) exp-drd/tests/sem_as_mutex2 (stderr) exp-drd/tests/sigalrm (stderr) exp-drd/tests/tc17_sembar (stderr) exp-drd/tests/tc18_semabuse (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-07 03:48:36
|
Nightly build on aston ( x86_64, Fedora Core 5 ) started at 2008-02-07 03:20:11 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 375 tests, 15 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/addressable (stderr) memcheck/tests/badjump (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/supp_unknown (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/blockfault (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) exp-drd/tests/pth_cond_race (stderr) exp-drd/tests/sem_as_mutex2 (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-07 03:43:06
|
Nightly build on trojan ( x86_64, Fedora Core 6 ) started at 2008-02-07 03:25:16 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 373 tests, 7 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/bug133694 (stdout) memcheck/tests/x86/bug133694 (stderr) memcheck/tests/x86/scalar (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) exp-drd/tests/sem_as_mutex2 (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-07 03:33:27
|
Nightly build on lloyd ( x86_64, Fedora 7 ) started at 2008-02-07 03:05:04 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 373 tests, 8 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) exp-drd/tests/pth_cond_race (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-07 03:27:11
|
Nightly build on dellow ( x86_64, Fedora 8 ) started at 2008-02-07 03:10:06 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 373 tests, 9 stderr failures, 3 stdout failures, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/pth_detached (stdout) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) exp-drd/tests/pth_cond_race (stderr) |
|
From: Tom H. <th...@cy...> - 2008-02-07 03:14:36
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2008-02-07 03:00:03 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 375 tests, 30 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/addressable (stderr) memcheck/tests/badjump (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/supp_unknown (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/blockfault (stderr) none/tests/fdleak_fcntl (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/hg01_all_ok (stderr) helgrind/tests/hg02_deadlock (stderr) helgrind/tests/hg03_inherit (stderr) helgrind/tests/hg04_race (stderr) helgrind/tests/hg05_race2 (stderr) helgrind/tests/tc01_simple_race (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc19_shadowmem (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) helgrind/tests/tc23_bogus_condwait (stderr) |
|
From: Konstantin S. <kon...@gm...> - 2008-02-07 00:03:35
|
John, > My patches for valgrind to support UserModeLinux implemented > a CLONE_CHILD_LETGO flag meaning, "do not virtualize the child; > let it run natively free." This happened to be a good idea for UML. May I ask you to send me this patch? If I understood you correctly, I need something similar for CLONE_UNTRACED. Thanks, --kcc |