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
(5) |
2
(5) |
3
(17) |
4
(21) |
5
(24) |
6
(14) |
7
(14) |
|
8
(14) |
9
(18) |
10
(13) |
11
(15) |
12
(12) |
13
(4) |
14
(11) |
|
15
(10) |
16
(6) |
17
(14) |
18
(16) |
19
(10) |
20
(3) |
21
(12) |
|
22
(12) |
23
(11) |
24
(19) |
25
(15) |
26
(14) |
27
(16) |
28
(12) |
|
From: <sv...@va...> - 2015-02-20 16:46:58
|
Author: florian
Date: Fri Feb 20 16:46:50 2015
New Revision: 14950
Log:
Update a comment.
Modified:
trunk/memcheck/mc_leakcheck.c
Modified: trunk/memcheck/mc_leakcheck.c
==============================================================================
--- trunk/memcheck/mc_leakcheck.c (original)
+++ trunk/memcheck/mc_leakcheck.c Fri Feb 20 16:46:50 2015
@@ -1632,7 +1632,7 @@
if (seg->isCH) continue;
// Don't poke around in device segments as this may cause
- // hangs. Exclude /dev/zero just in case someone allocated
+ // hangs. Include /dev/zero just in case someone allocated
// memory by explicitly mapping /dev/zero.
if (seg->kind == SkFileC
&& (VKI_S_ISCHR(seg->mode) || VKI_S_ISBLK(seg->mode))) {
|
Author: florian
Date: Fri Feb 20 14:00:23 2015
New Revision: 14949
Log:
Pass in a mask of segment kinds to VG_(get_segment_starts)
and VG_(am_get_segment_starts) to indicate which segments
should be collected. That should solve the following problem:
in m_main.c we used to:
seg_starts = VG_(get_segment_starts)( &n_seg_starts );
for (i = 0; i < n_seg_starts; i++) {
Word j, n;
NSegment const* seg
= VG_(am_find_nsegment)( seg_starts[i] );
vg_assert(seg);
if (seg->kind == SkFileC || seg->kind == SkAnonC) {
...
// ... dynamic memory allocation for valgrind
...
}
This caused the vassert(seg) to fire because the dynamic memory
allocation further down the loop changed segments such that a
valgrind segment which used to be non-SkFree suddenly became
SkFree and hence VG_(am_find_nsegment) returned NULL. Whoom.
With this revision we only collect the segments we're really
interested in. For the example above that is all client segments.
So if V allocates memory -- fine. That will not change the layout
of client segments.
Modified:
trunk/coregrind/m_aspacehl.c
trunk/coregrind/m_aspacemgr/aspacemgr-linux.c
trunk/coregrind/m_coredump/coredump-elf.c
trunk/coregrind/m_main.c
trunk/include/pub_tool_aspacehl.h
trunk/include/pub_tool_aspacemgr.h
trunk/memcheck/mc_leakcheck.c
Modified: trunk/coregrind/m_aspacehl.c
==============================================================================
--- trunk/coregrind/m_aspacehl.c (original)
+++ trunk/coregrind/m_aspacehl.c Fri Feb 20 14:00:23 2015
@@ -38,7 +38,9 @@
// addresses. The vector is dynamically allocated and should be freed
// by the caller when done. REQUIRES m_mallocfree to be running.
// Writes the number of addresses required into *n_acquired.
-Addr* VG_(get_segment_starts) ( /*OUT*/Int* n_acquired )
+// Only those segments are considered whose kind matches any of the kinds
+// given in KIND_MASK.
+Addr* VG_(get_segment_starts) ( UInt kind_mask, /*OUT*/Int* n_acquired )
{
Addr* starts;
Int n_starts, r = 0;
@@ -46,7 +48,7 @@
n_starts = 1;
while (True) {
starts = VG_(malloc)( "main.gss.1", n_starts * sizeof(Addr) );
- r = VG_(am_get_segment_starts)( starts, n_starts );
+ r = VG_(am_get_segment_starts)( kind_mask, starts, n_starts );
if (r >= 0)
break;
VG_(free)(starts);
Modified: trunk/coregrind/m_aspacemgr/aspacemgr-linux.c
==============================================================================
--- trunk/coregrind/m_aspacemgr/aspacemgr-linux.c (original)
+++ trunk/coregrind/m_aspacemgr/aspacemgr-linux.c Fri Feb 20 14:00:23 2015
@@ -624,7 +624,8 @@
return (i < 0) ? NULL : segnames + i;
}
-/* Collect up the start addresses of all non-free, non-resvn segments.
+/* Collect up the start addresses of segments whose kind matches one of
+ the kinds specified in kind_mask.
The interface is a bit strange in order to avoid potential
segment-creation races caused by dynamic allocation of the result
buffer *starts.
@@ -638,7 +639,7 @@
Correct use of this function may mean calling it multiple times in
order to establish a suitably-sized buffer. */
-Int VG_(am_get_segment_starts)( Addr* starts, Int nStarts )
+Int VG_(am_get_segment_starts)( UInt kind_mask, Addr* starts, Int nStarts )
{
Int i, j, nSegs;
@@ -647,9 +648,8 @@
nSegs = 0;
for (i = 0; i < nsegments_used; i++) {
- if (nsegments[i].kind == SkFree || nsegments[i].kind == SkResvn)
- continue;
- nSegs++;
+ if ((nsegments[i].kind & kind_mask) != 0)
+ nSegs++;
}
if (nSegs > nStarts) {
@@ -663,10 +663,8 @@
j = 0;
for (i = 0; i < nsegments_used; i++) {
- if (nsegments[i].kind == SkFree || nsegments[i].kind == SkResvn)
- continue;
- starts[j] = nsegments[i].start;
- j++;
+ if ((nsegments[i].kind & kind_mask) != 0)
+ starts[j++] = nsegments[i].start;
}
aspacem_assert(j == nSegs); /* this should not fail */
Modified: trunk/coregrind/m_coredump/coredump-elf.c
==============================================================================
--- trunk/coregrind/m_coredump/coredump-elf.c (original)
+++ trunk/coregrind/m_coredump/coredump-elf.c Fri Feb 20 14:00:23 2015
@@ -635,8 +635,9 @@
return; /* can't create file */
}
- /* Get the segments */
- seg_starts = VG_(get_segment_starts)(&n_seg_starts);
+ /* Get the client segments */
+ seg_starts = VG_(get_segment_starts)(SkFileC | SkAnonC | SkShmC,
+ &n_seg_starts);
/* First, count how many memory segments to dump */
num_phdrs = 1; /* start with notes */
Modified: trunk/coregrind/m_main.c
==============================================================================
--- trunk/coregrind/m_main.c (original)
+++ trunk/coregrind/m_main.c Fri Feb 20 14:00:23 2015
@@ -2185,7 +2185,7 @@
Int n_seg_starts;
Addr_n_ULong anu;
- seg_starts = VG_(get_segment_starts)( &n_seg_starts );
+ seg_starts = VG_(get_segment_starts)( SkFileC | SkFileV, &n_seg_starts );
vg_assert(seg_starts && n_seg_starts >= 0);
/* show them all to the debug info reader. allow_SkFileV has to
@@ -2207,7 +2207,7 @@
# elif defined(VGO_darwin)
{ Addr* seg_starts;
Int n_seg_starts;
- seg_starts = VG_(get_segment_starts)( &n_seg_starts );
+ seg_starts = VG_(get_segment_starts)( SkFileC, &n_seg_starts );
vg_assert(seg_starts && n_seg_starts >= 0);
/* show them all to the debug info reader.
@@ -2291,38 +2291,20 @@
vg_assert(VG_(running_tid) == VG_INVALID_THREADID);
VG_(running_tid) = tid_main;
- seg_starts = VG_(get_segment_starts)( &n_seg_starts );
+ seg_starts = VG_(get_segment_starts)( SkFileC | SkAnonC | SkShmC,
+ &n_seg_starts );
vg_assert(seg_starts && n_seg_starts >= 0);
- /* show interesting ones to the tool */
+ /* Show client segments to the tool */
for (i = 0; i < n_seg_starts; i++) {
Word j, n;
NSegment const* seg
= VG_(am_find_nsegment)( seg_starts[i] );
vg_assert(seg);
- if (seg->kind == SkFileC || seg->kind == SkAnonC) {
- /* This next assertion is tricky. If it is placed
- immediately before this 'if', it very occasionally fails.
- Why? Because previous iterations of the loop may have
- caused tools (via the new_mem_startup calls) to do
- dynamic memory allocation, and that may affect the mapped
- segments; in particular it may cause segment merging to
- happen. Hence we cannot assume that seg_starts[i], which
- reflects the state of the world before we started this
- loop, is the same as seg->start, as the latter reflects
- the state of the world (viz, mappings) at this particular
- iteration of the loop.
-
- Why does moving it inside the 'if' make it safe? Because
- any dynamic memory allocation done by the tools will
- affect only the state of Valgrind-owned segments, not of
- Client-owned segments. And the 'if' guards against that
- -- we only get in here for Client-owned segments.
-
- In other words: the loop may change the state of
- Valgrind-owned segments as it proceeds. But it should
- not cause the Client-owned segments to change. */
- vg_assert(seg->start == seg_starts[i]);
+ vg_assert(seg->kind == SkFileC || seg->kind == SkAnonC ||
+ seg->kind == SkShmC);
+ vg_assert(seg->start == seg_starts[i]);
+ {
VG_(debugLog)(2, "main",
"tell tool about %010lx-%010lx %c%c%c\n",
seg->start, seg->end,
Modified: trunk/include/pub_tool_aspacehl.h
==============================================================================
--- trunk/include/pub_tool_aspacehl.h (original)
+++ trunk/include/pub_tool_aspacehl.h Fri Feb 20 14:00:23 2015
@@ -37,7 +37,9 @@
// addresses. The vector is dynamically allocated and should be freed
// by the caller when done. REQUIRES m_mallocfree to be running.
// Writes the number of addresses required into *n_acquired.
-extern Addr* VG_(get_segment_starts) ( /*OUT*/Int* n_acquired );
+// Only those segments are considered whose kind matches any of the kinds
+// given in KIND_MASK.
+extern Addr* VG_(get_segment_starts)( UInt kind_mask, /*OUT*/Int* n_acquired );
#endif // __PUB_TOOL_ASPACEHL_H
Modified: trunk/include/pub_tool_aspacemgr.h
==============================================================================
--- trunk/include/pub_tool_aspacemgr.h (original)
+++ trunk/include/pub_tool_aspacemgr.h Fri Feb 20 14:00:23 2015
@@ -36,16 +36,17 @@
//--------------------------------------------------------------
// Definition of address-space segments
-/* Describes segment kinds. */
+/* Describes segment kinds. Enumerators are one-hot encoded so they
+ can be or'ed together. */
typedef
enum {
- SkFree, // unmapped space
- SkAnonC, // anonymous mapping belonging to the client
- SkAnonV, // anonymous mapping belonging to valgrind
- SkFileC, // file mapping belonging to the client
- SkFileV, // file mapping belonging to valgrind
- SkShmC, // shared memory segment belonging to the client
- SkResvn // reservation
+ SkFree = 0x01, // unmapped space
+ SkAnonC = 0x02, // anonymous mapping belonging to the client
+ SkAnonV = 0x04, // anonymous mapping belonging to valgrind
+ SkFileC = 0x08, // file mapping belonging to the client
+ SkFileV = 0x10, // file mapping belonging to valgrind
+ SkShmC = 0x20, // shared memory segment belonging to the client
+ SkResvn = 0x40 // reservation
}
SegKind;
@@ -115,7 +116,8 @@
NSegment;
-/* Collect up the start addresses of all non-free, non-resvn segments.
+/* Collect up the start addresses of segments whose kind matches one of
+ the kinds specified in kind_mask.
The interface is a bit strange in order to avoid potential
segment-creation races caused by dynamic allocation of the result
buffer *starts.
@@ -128,7 +130,8 @@
Correct use of this function may mean calling it multiple times in
order to establish a suitably-sized buffer. */
-extern Int VG_(am_get_segment_starts)( Addr* starts, Int nStarts );
+extern Int VG_(am_get_segment_starts)( UInt kind_mask, Addr* starts,
+ Int nStarts );
/* Finds the segment containing 'a'. Only returns file/anon/resvn
segments. This returns a 'NSegment const *' - a pointer to
Modified: trunk/memcheck/mc_leakcheck.c
==============================================================================
--- trunk/memcheck/mc_leakcheck.c (original)
+++ trunk/memcheck/mc_leakcheck.c Fri Feb 20 14:00:23 2015
@@ -1612,7 +1612,8 @@
{
Int i;
Int n_seg_starts;
- Addr* seg_starts = VG_(get_segment_starts)( &n_seg_starts );
+ Addr* seg_starts = VG_(get_segment_starts)( SkFileC | SkAnonC | SkShmC,
+ &n_seg_starts );
tl_assert(seg_starts && n_seg_starts > 0);
@@ -1624,8 +1625,9 @@
SizeT seg_size;
NSegment const* seg = VG_(am_find_nsegment)( seg_starts[i] );
tl_assert(seg);
+ tl_assert(seg->kind == SkFileC || seg->kind == SkAnonC ||
+ seg->kind == SkShmC);
- if (seg->kind != SkFileC && seg->kind != SkAnonC) continue;
if (!(seg->hasR && seg->hasW)) continue;
if (seg->isCH) continue;
|
|
From: <sv...@va...> - 2015-02-20 12:30:12
|
Author: sewardj
Date: Fri Feb 20 12:29:59 2015
New Revision: 14948
Log:
canonicaliseSymtab: fix silly logic that could cause the function to
loop forever. In particular, it will do that when two symbols have
exactly the same address range but differ in their .isText attribute.
Fixes #342117.
Modified:
trunk/coregrind/m_debuginfo/storage.c
Modified: trunk/coregrind/m_debuginfo/storage.c
==============================================================================
--- trunk/coregrind/m_debuginfo/storage.c (original)
+++ trunk/coregrind/m_debuginfo/storage.c Fri Feb 20 12:29:59 2015
@@ -1636,15 +1636,16 @@
cleanup_more:
- /* If two symbols have identical address ranges, and agree on
- .isText and .isIFunc, merge them into a single entry, but
- preserve both names, so we end up knowing all the names for that
- particular address range. */
+ /* BEGIN Detect and "fix" identical address ranges. */
while (1) {
Word r, w, n_merged;
n_merged = 0;
w = 0;
- /* A pass merging entries together */
+ /* A pass merging entries together in the case where they agree
+ on .isText -- that is, either: both are .isText or both are
+ not .isText. They are merged into a single entry, but both
+ sets of names are preserved, so we end up knowing all the
+ names for that particular address range.*/
for (r = 1; r < di->symtab_used; r++) {
vg_assert(w < r);
if ( di->symtab[w].avmas.main == di->symtab[r].avmas.main
@@ -1675,6 +1676,46 @@
w = r;
}
}
+
+ /* A second pass merging entries together where one .isText but
+ the other isn't. In such cases, just ignore the non-.isText
+ one (a heuristic hack.) */
+ for (r = 1; r < di->symtab_used; r++) {
+ /* Either of the symbols might already have been zapped by
+ the previous pass, so we first have to check that. */
+ if (di->symtab[r-1].pri_name == NULL) continue;
+ if (di->symtab[r-0].pri_name == NULL) continue;
+ /* ok, they are both still valid. Identical address ranges? */
+ if (di->symtab[r-1].avmas.main != di->symtab[r-0].avmas.main) continue;
+ if (di->symtab[r-1].size != di->symtab[r-0].size) continue;
+ /* Identical address ranges. They must disagree on .isText
+ since if they agreed, the previous pass would have merged
+ them. */
+ if (di->symtab[r-1].isText && di->symtab[r-0].isText) vg_assert(0);
+ if (!di->symtab[r-1].isText && !di->symtab[r-0].isText) vg_assert(0);
+ Word to_zap = di->symtab[r-1].isText ? (r-0) : (r-1);
+ Word to_keep = di->symtab[r-1].isText ? (r-1) : (r-0);
+ vg_assert(!di->symtab[to_zap].isText);
+ vg_assert(di->symtab[to_keep].isText);
+ /* Add to_zap's names to to_keep if to_zap has secondary names
+ or to_zap's and to_keep's primary names differ. */
+ if (di->symtab[to_zap].sec_names
+ || (0 != VG_(strcmp)(di->symtab[to_zap].pri_name,
+ di->symtab[to_keep].pri_name))) {
+ add_DiSym_names_to_from(di, &di->symtab[to_keep],
+ &di->symtab[to_zap]);
+ }
+ /* Mark to_zap as not-in use in the same way as in the
+ previous loop. */
+ di->symtab[to_zap].pri_name = NULL;
+ if (di->symtab[to_zap].sec_names) {
+ ML_(dinfo_free)(di->symtab[to_zap].sec_names);
+ di->symtab[to_zap].sec_names = NULL;
+ }
+ VG_(memset)(&di->symtab[to_zap], 0, sizeof(DiSym));
+ n_merged++;
+ }
+
TRACE_SYMTAB( "canonicaliseSymtab: %ld symbols merged\n", n_merged);
if (n_merged == 0)
break;
@@ -1691,9 +1732,10 @@
}
vg_assert(w + n_merged == di->symtab_used);
di->symtab_used = w;
- }
+ } /* while (1) */
+ /* END Detect and "fix" identical address ranges. */
- /* Detect and "fix" overlapping address ranges. */
+ /* BEGIN Detect and "fix" overlapping address ranges. */
n_truncated = 0;
for (i = 0; i < ((Word)di->symtab_used) -1; i++) {
@@ -1781,6 +1823,7 @@
}
n_truncated++;
}
+ /* END Detect and "fix" overlapping address ranges. */
if (n_truncated > 0) goto cleanup_more;
|