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
(20) |
2
(19) |
3
(7) |
|
4
(13) |
5
(24) |
6
(9) |
7
(12) |
8
(8) |
9
(34) |
10
(28) |
|
11
(20) |
12
(23) |
13
(12) |
14
(10) |
15
(15) |
16
(24) |
17
(26) |
|
18
(17) |
19
(14) |
20
(14) |
21
(8) |
22
(12) |
23
(22) |
24
(10) |
|
25
(21) |
26
(21) |
27
(18) |
28
(8) |
29
(13) |
30
(15) |
|
|
From: Nicholas N. <nj...@cs...> - 2007-11-23 22:38:09
|
On Fri, 23 Nov 2007, Josef Weidendorfer wrote:
> VG_(expand_file_name) looks almost good to me.
>
> In callgrind, I allow to set an absolute output name with eg. "--base=/tmp/clgout".
> If the format starts with a slash, we could skip prefixing the output with
> the base_dir.
Done.
> Very minor points:
> playing a little bit with %q, I got misleading errors.
>
> weidendo@linux:~> valgrind --log-file=foo%q ls
> ==17529== --log-file: expected 'p' or 'q' or '%' after '%'
> valgrind: Bad option '--log-file=foo%q'; aborting.
> valgrind: Use --help for more information.
>
> weidendo@linux:~> valgrind --log-file=foo%q{x}%q{y} ls
> ==17625== --log-file: environment variable x is not set
> valgrind: Bad option '--log-file=foo%q{x'; aborting.
> valgrind: Use --help for more information.
Fixed and fixed.
Thanks for the feedback!
N
|
|
From: <sv...@va...> - 2007-11-23 22:37:34
|
Author: njn
Date: 2007-11-23 22:37:35 +0000 (Fri, 23 Nov 2007)
New Revision: 7204
Log:
Tweak VG_(expand_file_name), as per Josef's suggestions.
Modified:
trunk/coregrind/m_options.c
trunk/include/pub_tool_options.h
Modified: trunk/coregrind/m_options.c
===================================================================
--- trunk/coregrind/m_options.c 2007-11-23 01:42:10 UTC (rev 7203)
+++ trunk/coregrind/m_options.c 2007-11-23 22:37:35 UTC (rev 7204)
@@ -144,11 +144,18 @@
goto bad;
}
+ // If 'format' starts with a '/', do not prefix with startup dir.
+ if (format[0] != '/') {
+ j += VG_(strlen)(base_dir);
+ }
+
// The 10 is slop, it should be enough in most cases.
- j = VG_(strlen)(base_dir);
len = j + VG_(strlen)(format) + 10;
out = VG_(malloc)( len );
- VG_(strcpy)(out, base_dir);
+ if (format[0] != '/') {
+ VG_(strcpy)(out, base_dir);
+ out[j++] = '/';
+ }
#define ENSURE_THIS_MUCH_SPACE(x) \
if (j + x >= len) { \
@@ -156,7 +163,6 @@
out = VG_(realloc)(out, len); \
}
- out[j++] = '/';
while (format[i]) {
if (format[i] != '%') {
ENSURE_THIS_MUCH_SPACE(1);
@@ -178,35 +184,44 @@
j += VG_(sprintf)(&out[j], "%d", pid);
i++;
}
- else if ('q' == format[i] && '{' == format[i+1]) {
- // Get the env var name, print its contents.
- Char* qualname;
- Char* qual;
- i += 2;
- qualname = &format[i];
- while (True) {
- if (0 == format[i]) {
- VG_(message)(Vg_UserMsg, "%s: malformed %%q specifier",
- option_name);
- goto bad;
- } else if ('}' == format[i]) {
- // Temporarily replace the '}' with NUL to extract var name.
- format[i] = 0;
- qual = VG_(getenv)(qualname);
- if (NULL == qual) {
- VG_(message)(Vg_UserMsg,
- "%s: environment variable %s is not set",
- option_name, qualname);
+ else if ('q' == format[i]) {
+ i++;
+ if ('{' == format[i]) {
+ // Get the env var name, print its contents.
+ Char* qualname;
+ Char* qual;
+ i++;
+ qualname = &format[i];
+ while (True) {
+ if (0 == format[i]) {
+ VG_(message)(Vg_UserMsg, "%s: malformed %%q specifier",
+ option_name);
goto bad;
+ } else if ('}' == format[i]) {
+ // Temporarily replace the '}' with NUL to extract var
+ // name.
+ format[i] = 0;
+ qual = VG_(getenv)(qualname);
+ if (NULL == qual) {
+ VG_(message)(Vg_UserMsg,
+ "%s: environment variable %s is not set",
+ option_name, qualname);
+ format[i] = '}'; // Put the '}' back.
+ goto bad;
+ }
+ format[i] = '}'; // Put the '}' back.
+ i++;
+ break;
}
- format[i] = '}'; // Put the '}' back.
i++;
- break;
}
- i++;
+ ENSURE_THIS_MUCH_SPACE(VG_(strlen)(qual));
+ j += VG_(sprintf)(&out[j], "%s", qual);
+ } else {
+ VG_(message)(Vg_UserMsg,
+ "%s: expected '{' after '%%q'", option_name);
+ goto bad;
}
- ENSURE_THIS_MUCH_SPACE(VG_(strlen)(qual));
- j += VG_(sprintf)(&out[j], "%s", qual);
}
else {
// Something else, abort.
Modified: trunk/include/pub_tool_options.h
===================================================================
--- trunk/include/pub_tool_options.h 2007-11-23 01:42:10 UTC (rev 7203)
+++ trunk/include/pub_tool_options.h 2007-11-23 22:37:35 UTC (rev 7204)
@@ -130,6 +130,9 @@
isn't set, we abort. If the "{QUAL}" part is malformed, we abort.
- "%%" is replaced with "%".
Anything else after '%' causes an abort.
+ If the format specifies a relative file name, it's put in the program's
+ initial working directory. If it specifies an absolute file name (ie.
+ starts with '/') then it is put there.
*/
extern Char* VG_(expand_file_name)(Char* option_name, Char* format);
|
|
From: Nicholas N. <nj...@cs...> - 2007-11-23 22:24:48
|
On Fri, 23 Nov 2007, Gregor Jasny wrote: > I've got an idea for a MMX checker tool. First some background: > When you use MMX/SSE instructions on the x86 platform you have to reset > the FPU stack with the 'emms' instruction after calculations finished. > Otherwise the following floating point instructions will fail. > > I have a large C++ project here and somewhere in an static initializer > such an reset is omitted. Spotting the missing place is quite hard. > I've tried to use GDB to watch the $ftag register, but GDBs single > instruction stepping takes ages. > > So the valgrind tool should do the following: If an FPU instruction is > executed with a corrupt FPU stack, print the position of the last > MMX/SSE instruction. > > I've skimmed the lackey source code, but have still no idea where to > start. It would be nice if you could provide me some assistance or even > some source code. > > What do you think? It might be possible. If it is possible, it probably wouldn't be all that hard, i.e. the source code needn't be that long, but understanding Valgrind enough to write it requires some effort. The key factor is that Valgrind translates x86 (or PPC) code into an intermediate representation (IR). The question is whether the IR preserves the 'emms' instruction in such a way that you can recognise it. Judging from VEX/priv/guest-x86/toIR.c:do_EMMS_preamble() (around line 5090), it's not represented explicitly, but rather all the FP regs get zeroed, as does the FP stack top. You might be able to detect that manually; it's conceivable that an optimisation pass might remove some of the zeroings if it knew they weren't necessary, but I don't know how likely that is. To understand the IR, look at VEX/pub/libvex_ir.h. Make sure you use the SVN version, it has much better comments in it than the 3.2.3 version. Then, Memcheck might be a better example tool than Lackey, to see how a wider range of instructions are handled. Hope this helps, feel free to ask more questions if you have trouble. Nick |
|
From: Julian S. <js...@ac...> - 2007-11-23 15:49:22
|
Hi. In fact Helgrind will be available in the soon to happen 3.3.0 release. You can get it immediately by checking out the svn trunk as described at http://valgrind.org/downloads/repository.html. Compared to the 2.2.0 Helgrind there are already some extensions which are documented in Valgrind's user manual. J On Friday 23 November 2007 16:29, Ali Jannesari wrote: > Hi, > > I am a PhD student at university of Karlsruhe-Germany and working on > Debugging and race detection of parallel programs. As a part of my resear= ch > I want to extend some features in Helgrind. > > > > Just want to know please if there is a possibility of getting Helgrind ba= ck > to work in the future release? Is there any support for Helgrind? > > > > Thank you very much. > > > > Regards > > Ali Jannesari > > > > --- > > M. Sc. Ali Jannesari > > Universit=E4t Karlsruhe > > Institut f=FCr Programmstrukturen > > und Datenorganisation (IPD) > > Am Fasanengarten 5, Geb. 50.34, Raum 346 > > 76131 Karlsruhe > > Tel. 0721 / 608 =96 4064 > > Jan...@ip... > > http://www.ipd.uka.de/~jannesari |
|
From: Ali J. <jan...@ip...> - 2007-11-23 15:29:10
|
Hi, I am a PhD student at university of Karlsruhe-Germany and working on Debugging and race detection of parallel programs. As a part of my = research I want to extend some features in Helgrind.=20 =20 Just want to know please if there is a possibility of getting Helgrind = back to work in the future release? Is there any support for Helgrind?=20 =20 Thank you very much. =20 Regards Ali Jannesari =20 --- M. Sc. Ali Jannesari Universit=E4t Karlsruhe Institut f=FCr Programmstrukturen=20 und Datenorganisation (IPD)=20 Am Fasanengarten 5, Geb. 50.34, Raum 346 76131 Karlsruhe Tel. 0721 / 608 =96 4064 Jan...@ip... http://www.ipd.uka.de/~jannesari =20 =20 |
|
From: Konstantin S. <kon...@gm...> - 2007-11-23 14:49:38
|
I don't have access to openSUSE (neither 10.1 nor 10.2). Could you please send me index.fo produced ob both systems as well as version strings for xsltproc and pdfxmltex? --kcc On Nov 23, 2007 5:30 PM, Julian Seward <js...@ac...> wrote: > On Friday 23 November 2007 14:27, Konstantin Serebryany wrote: > > >> If anybody can figure out why the PDF doc build fails on > > >> openSUSE 10.2 and later, that would be great. > > > > Who is guilty, xsltproc or pdfxmltex? > > Does xsltproc produce the same index.fo on these two systems? > > If you have the time to chase this around, that would be great :-) > > J > |
|
From: Julian S. <js...@ac...> - 2007-11-23 14:30:38
|
On Friday 23 November 2007 14:27, Konstantin Serebryany wrote: > >> If anybody can figure out why the PDF doc build fails on > >> openSUSE 10.2 and later, that would be great. > > Who is guilty, xsltproc or pdfxmltex? > Does xsltproc produce the same index.fo on these two systems? If you have the time to chase this around, that would be great :-) J |
|
From: Konstantin S. <kon...@gm...> - 2007-11-23 13:27:22
|
>> If anybody can figure out why the PDF doc build fails on >> openSUSE 10.2 and later, that would be great. Who is guilty, xsltproc or pdfxmltex? Does xsltproc produce the same index.fo on these two systems? On Nov 23, 2007 2:43 PM, Julian Seward <js...@ac...> wrote: > On Friday 23 November 2007 08:19, Konstantin Serebryany wrote: > > > I've tried building printable valgrind docs from the svn trunc. [...] > > ! ==> Fatal error occurred, the output PDF file is not finished! > > Yes. The PDF build chain is very fragile. I keep a SuSE 10.1 machine > available purely so I can build the PDF -- it will not build on > openSUSE 10.2 or later, for unknown reasons. Even then it requires > the following hack to succeed (see docs/README): > > pdfxmltex still bombs when building the print docs. On SuSE 10.1 I > edited /etc/texmf/web2c/texmf.cnf and changed > pool_size.pdfxmltex = 500000 > to > pool_size.pdfxmltex = 1500000 > and that fixes it. > > For these kinds of reasons, in the distribution tarball, the PDF > docs and HTML docs are pre-built. > > If anybody can figure out why the PDF doc build fails on > openSUSE 10.2 and later, that would be great. > > I can send PDF of current docs if you want. > > J > |
|
From: Julian S. <js...@ac...> - 2007-11-23 11:43:49
|
On Friday 23 November 2007 08:19, Konstantin Serebryany wrote:
> I've tried building printable valgrind docs from the svn trunc. [...]
> ! ==> Fatal error occurred, the output PDF file is not finished!
Yes. The PDF build chain is very fragile. I keep a SuSE 10.1 machine
available purely so I can build the PDF -- it will not build on
openSUSE 10.2 or later, for unknown reasons. Even then it requires
the following hack to succeed (see docs/README):
pdfxmltex still bombs when building the print docs. On SuSE 10.1 I
edited /etc/texmf/web2c/texmf.cnf and changed
pool_size.pdfxmltex = 500000
to
pool_size.pdfxmltex = 1500000
and that fixes it.
For these kinds of reasons, in the distribution tarball, the PDF
docs and HTML docs are pre-built.
If anybody can figure out why the PDF doc build fails on
openSUSE 10.2 and later, that would be great.
I can send PDF of current docs if you want.
J
|
|
From: Josef W. <Jos...@gm...> - 2007-11-23 11:09:52
|
On Friday 23 November 2007, sv...@va... wrote:
> Author: njn
> Date: 2007-11-23 01:41:32 +0000 (Fri, 23 Nov 2007)
> New Revision: 7202
>
> Log:
> Fixed up the log file mess throughout, including the docs. This killed
> --log-file-qualifier and --log-file-exactly.
Thanks!
> +// - Get Josef to update the Callgrind --callgrind-out-file option.
I'll do.
VG_(expand_file_name) looks almost good to me.
In callgrind, I allow to set an absolute output name with eg. "--base=/tmp/clgout".
If the format starts with a slash, we could skip prefixing the output with
the base_dir.
So what about
===================================================================
--- m_options.c (Revision 7203)
+++ m_options.c (Arbeitskopie)
@@ -144,11 +144,17 @@
goto bad;
}
+ // if format starts with a '/', do not prefix with startup dir
+ if (format[0] != '/')
+ j += VG_(strlen)(base_dir);
+
// The 10 is slop, it should be enough in most cases.
- j = VG_(strlen)(base_dir);
len = j + VG_(strlen)(format) + 10;
out = VG_(malloc)( len );
- VG_(strcpy)(out, base_dir);
+ if (format[0] != '/') {
+ VG_(strcpy)(out, base_dir);
+ out[j++] = '/';
+ }
#define ENSURE_THIS_MUCH_SPACE(x) \
if (j + x >= len) { \
@@ -156,7 +162,6 @@
out = VG_(realloc)(out, len); \
}
- out[j++] = '/';
while (format[i]) {
if (format[i] != '%') {
ENSURE_THIS_MUCH_SPACE(1);
===================================================================
Very minor points:
playing a little bit with %q, I got misleading errors.
weidendo@linux:~> valgrind --log-file=foo%q ls
==17529== --log-file: expected 'p' or 'q' or '%' after '%'
valgrind: Bad option '--log-file=foo%q'; aborting.
valgrind: Use --help for more information.
weidendo@linux:~> valgrind --log-file=foo%q{x}%q{y} ls
==17625== --log-file: environment variable x is not set
valgrind: Bad option '--log-file=foo%q{x'; aborting.
valgrind: Use --help for more information.
Thanks again for doing this,
Josef
|
|
From: Gregor J. <ja...@vi...> - 2007-11-23 10:25:34
|
Hi, I've got an idea for a MMX checker tool. First some background: When you use MMX/SSE instructions on the x86 platform you have to reset the FPU stack with the 'emms' instruction after calculations finished. Otherwise the following floating point instructions will fail. I have a large C++ project here and somewhere in an static initializer such an reset is omitted. Spotting the missing place is quite hard. I've tried to use GDB to watch the $ftag register, but GDBs single instruction stepping takes ages. So the valgrind tool should do the following: If an FPU instruction is executed with a corrupt FPU stack, print the position of the last MMX/SSE instruction. I've skimmed the lackey source code, but have still no idea where to start. It would be nice if you could provide me some assistance or even some source code. What do you think? Thanks, Gregor |
|
From: Nicholas N. <nj...@cs...> - 2007-11-23 08:52:02
|
On Thu, 22 Nov 2007, Florian Krohm wrote: > Do you have plans to morph branches/ORIGIN_TRACKING into an > experimental tool? I read the pldi paper and understand it has > limitations but it could still make a quite a difference if a > bug is of the kind where it can track its origin. > I've checked out the branch to play with it a bit, but > unfortunately it does not compile, due to changes in VEX IR. No... the cost/benefit trade-off wasn't very good -- it added quite a bit of complication to Memcheck and the core. N |
|
From: Konstantin S. <kon...@gm...> - 2007-11-23 07:19:27
|
Hi,
I've tried building printable valgrind docs from the svn trunc.
If I type 'cd docs && make print-docs' I get
make print-docs
Generating PDF file: ../docs/print/index.pdf (please be patient)...
export XML_CATALOG_FILES=/etc/xml/catalog && \
mkdir -p ../docs/print && \
mkdir -p ../docs/print/images && \
cp ../docs/images/massif-graph-sm.png ../docs/print/images && \
xsltproc --xinclude -o ../docs/print/index.fo
../docs/lib/vg-fo.xsl../docs/xml/index.xml && \
(cd ../docs/print && \
( pdfxmltex index.fo && \
pdfxmltex index.fo && \
pdfxmltex index.fo ) &> print.log < /dev/null && \
echo "Generating PS file: ../docs/print/index.ps ..." && \
pdftops index.pdf && \
rm -f *.log *.aux *.fo *.out)
Making portrait pages on USletter paper (8.5inx11in)
pre encountered in chapter, but no template matches.
make: *** [print-docs] Error 1
docs/print/print.log contains
! Emergency stop.
<inserted text>
\par
l.797 ...)</fo:inline>-related Options</fo:marker>
<fo:block font-size="
17.28...
! ==> Fatal error occurred, the output PDF file is not finished!
Transcript written on index.log.
If I run 'pdfxmltex index.fo' manually, I get slightly further, but then I
get tons of complains like
! pdfTeX warning (dest): name{tech-docs} has been referenced but does
not exist
and the resulting pdf is truncated.
What did I do wrong?
May be I have old versions of tools?
pdfxmltex
This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4)
xsltproc --version
Using libxml 20624, libxslt 10115 and libexslt 812
xsltproc was compiled against libxml 20622, libxslt 10115 and libexslt
812
libxslt 10115 was compiled against libxml 20622
libexslt 812 was compiled against libxml 20622
Thanks,
--kcc
|
|
From: Florian K. <br...@ac...> - 2007-11-23 05:22:11
|
On Thursday 22 November 2007 1:53 pm, Julian Seward wrote: > Greetings all. > > I'm trying to wrap up the long overdue 3.3.0 release. It's been > nearly 18 months since 3.2.0 shipped. The 3.2.X line has done well, > but it's a bit old now. Plus we've accumulated a bunch of cool new > stuff to ship over the past 18 months: > > * revised Massif (almost a complete rewrite) > * Helgrind works again (a complete rewrite) > * Cachegrind does branch-misprediction profiling > * experimental tools section (Omega, DRD) Do you have plans to morph branches/ORIGIN_TRACKING into an experimental tool? I read the pldi paper and understand it has limitations but it could still make a quite a difference if a bug is of the kind where it can track its origin. I've checked out the branch to play with it a bit, but unfortunately it does not compile, due to changes in VEX IR. Florian |
|
From: Tom H. <th...@cy...> - 2007-11-23 03:55:31
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2007-11-23 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 == 318 tests, 60 stderr failures, 3 stdout failures, 27 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/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/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/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-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/cmdline1 (stdout) none/tests/cmdline2 (stdout) 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/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/tc11_XCHG (stderr) helgrind/tests/tc12_rwl_trivial (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) |
|
From: Tom H. <th...@cy...> - 2007-11-23 03:30:55
|
Nightly build on lloyd ( x86_64, Fedora 7 ) started at 2007-11-23 03:05:05 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 == 352 tests, 6 stderr failures, 4 stdout failures, 0 post failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (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) |
|
From: Tom H. <th...@cy...> - 2007-11-23 03:26:12
|
Nightly build on dellow ( x86_64, Fedora 8 ) started at 2007-11-23 03:10:05 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 == 352 tests, 9 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/pth_detached (stdout) helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) helgrind/tests/tc23_bogus_condwait (stderr) |
|
From: Tom H. <th...@cy...> - 2007-11-23 03:13:26
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2007-11-23 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 == 354 tests, 24 stderr failures, 3 stdout failures, 0 post failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) 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/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) |
|
From: <sv...@va...> - 2007-11-23 02:46:28
|
Author: sewardj
Date: 2007-11-23 02:46:29 +0000 (Fri, 23 Nov 2007)
New Revision: 1800
Log:
Implement DAA/DAS/AAA/AAS. Really stupid and ugly instructions which
might have made sense in 1973, but not now. Fixes #152501.
Modified:
trunk/priv/guest-x86/gdefs.h
trunk/priv/guest-x86/ghelpers.c
trunk/priv/guest-x86/toIR.c
Modified: trunk/priv/guest-x86/gdefs.h
===================================================================
--- trunk/priv/guest-x86/gdefs.h 2007-11-20 17:29:08 UTC (rev 1799)
+++ trunk/priv/guest-x86/gdefs.h 2007-11-23 02:46:29 UTC (rev 1800)
@@ -114,6 +114,8 @@
UInt arg, UInt rot_amt, UInt eflags_in, UInt sz
);
+extern UInt x86g_calculate_daa_das_aaa_aas ( UInt AX_and_flags, UInt opcode );
+
extern ULong x86g_check_fldcw ( UInt fpucw );
extern UInt x86g_create_fpucw ( UInt fpround );
Modified: trunk/priv/guest-x86/ghelpers.c
===================================================================
--- trunk/priv/guest-x86/ghelpers.c 2007-11-20 17:29:08 UTC (rev 1799)
+++ trunk/priv/guest-x86/ghelpers.c 2007-11-23 02:46:29 UTC (rev 1800)
@@ -1875,6 +1875,135 @@
}
+/* CALLED FROM GENERATED CODE: CLEAN HELPER */
+/* Calculate both flags and value result for DAA/DAS/AAA/AAS.
+ AX value in low half of arg, OSZACP in upper half.
+ See guest-x86/toIR.c usage point for details.
+*/
+static UInt calc_parity_8bit ( UInt w32 ) {
+ UInt i;
+ UInt p = 1;
+ for (i = 0; i < 8; i++)
+ p ^= (1 & (w32 >> i));
+ return p;
+}
+UInt x86g_calculate_daa_das_aaa_aas ( UInt flags_and_AX, UInt opcode )
+{
+ UInt r_AL = (flags_and_AX >> 0) & 0xFF;
+ UInt r_AH = (flags_and_AX >> 8) & 0xFF;
+ UInt r_O = (flags_and_AX >> (16 + X86G_CC_SHIFT_O)) & 1;
+ UInt r_S = (flags_and_AX >> (16 + X86G_CC_SHIFT_S)) & 1;
+ UInt r_Z = (flags_and_AX >> (16 + X86G_CC_SHIFT_Z)) & 1;
+ UInt r_A = (flags_and_AX >> (16 + X86G_CC_SHIFT_A)) & 1;
+ UInt r_C = (flags_and_AX >> (16 + X86G_CC_SHIFT_C)) & 1;
+ UInt r_P = (flags_and_AX >> (16 + X86G_CC_SHIFT_P)) & 1;
+ UInt result = 0;
+
+ switch (opcode) {
+ case 0x27: { /* DAA */
+ UInt old_AL = r_AL;
+ UInt old_C = r_C;
+ r_C = 0;
+ if ((r_AL & 0xF) > 9 || r_A == 1) {
+ r_AL = r_AL + 6;
+ r_C = old_C;
+ if (r_AL >= 0x100) r_C = 1;
+ r_A = 1;
+ } else {
+ r_A = 0;
+ }
+ if (old_AL > 0x99 || old_C == 1) {
+ r_AL = r_AL + 0x60;
+ r_C = 1;
+ } else {
+ r_C = 0;
+ }
+ /* O is undefined. S Z and P are set according to the
+ result. */
+ r_AL &= 0xFF;
+ r_O = 0; /* let's say */
+ r_S = (r_AL & 0x80) ? 1 : 0;
+ r_Z = (r_AL == 0) ? 1 : 0;
+ r_P = calc_parity_8bit( r_AL );
+ break;
+ }
+ case 0x2F: { /* DAS */
+ UInt old_AL = r_AL;
+ UInt old_C = r_C;
+ r_C = 0;
+ if ((r_AL & 0xF) > 9 || r_A == 1) {
+ Bool borrow = r_AL < 6;
+ r_AL = r_AL - 6;
+ r_C = old_C;
+ if (borrow) r_C = 1;
+ r_A = 1;
+ } else {
+ r_A = 0;
+ }
+ if (old_AL > 0x99 || old_C == 1) {
+ r_AL = r_AL - 0x60;
+ r_C = 1;
+ } else {
+ /* Intel docs are wrong: r_C = 0; */
+ }
+ /* O is undefined. S Z and P are set according to the
+ result. */
+ r_AL &= 0xFF;
+ r_O = 0; /* let's say */
+ r_S = (r_AL & 0x80) ? 1 : 0;
+ r_Z = (r_AL == 0) ? 1 : 0;
+ r_P = calc_parity_8bit( r_AL );
+ break;
+ }
+ case 0x37: { /* AAA */
+ Bool nudge = r_AL > 0xF9;
+ if ((r_AL & 0xF) > 9 || r_A == 1) {
+ r_AL = r_AL + 6;
+ r_AH = r_AH + 1 + (nudge ? 1 : 0);
+ r_A = 1;
+ r_C = 1;
+ r_AL = r_AL & 0xF;
+ } else {
+ r_A = 0;
+ r_C = 0;
+ r_AL = r_AL & 0xF;
+ }
+ /* O S Z and P are undefined. */
+ r_O = r_S = r_Z = r_P = 0; /* let's say */
+ break;
+ }
+ case 0x3F: { /* AAS */
+ Bool nudge = r_AL < 0x06;
+ if ((r_AL & 0xF) > 9 || r_A == 1) {
+ r_AL = r_AL - 6;
+ r_AH = r_AH - 1 - (nudge ? 1 : 0);
+ r_A = 1;
+ r_C = 1;
+ r_AL = r_AL & 0xF;
+ } else {
+ r_A = 0;
+ r_C = 0;
+ r_AL = r_AL & 0xF;
+ }
+ /* O S Z and P are undefined. */
+ r_O = r_S = r_Z = r_P = 0; /* let's say */
+ break;
+ }
+ default:
+ vassert(0);
+ }
+ result = ( (r_O & 1) << (16 + X86G_CC_SHIFT_O) )
+ | ( (r_S & 1) << (16 + X86G_CC_SHIFT_S) )
+ | ( (r_Z & 1) << (16 + X86G_CC_SHIFT_Z) )
+ | ( (r_A & 1) << (16 + X86G_CC_SHIFT_A) )
+ | ( (r_C & 1) << (16 + X86G_CC_SHIFT_C) )
+ | ( (r_P & 1) << (16 + X86G_CC_SHIFT_P) )
+ | ( (r_AH & 0xFF) << 8 )
+ | ( (r_AL & 0xFF) << 0 );
+ return result;
+}
+
+
/* CALLED FROM GENERATED CODE */
/* DIRTY HELPER (non-referentially-transparent) */
/* Horrible hack. On non-x86 platforms, return 1. */
Modified: trunk/priv/guest-x86/toIR.c
===================================================================
--- trunk/priv/guest-x86/toIR.c 2007-11-20 17:29:08 UTC (rev 1799)
+++ trunk/priv/guest-x86/toIR.c 2007-11-23 02:46:29 UTC (rev 1800)
@@ -11196,44 +11196,62 @@
DIP("leave\n");
break;
-//-- /* ---------------- Misc weird-ass insns --------------- */
-//--
-//-- case 0x27: /* DAA */
-//-- case 0x2F: /* DAS */
-//-- t1 = newTemp(cb);
-//-- uInstr2(cb, GET, 1, ArchReg, R_AL, TempReg, t1);
-//-- /* Widen %AL to 32 bits, so it's all defined when we push it. */
-//-- uInstr1(cb, WIDEN, 4, TempReg, t1);
-//-- uWiden(cb, 1, False);
-//-- uInstr0(cb, CALLM_S, 0);
-//-- uInstr1(cb, PUSH, 4, TempReg, t1);
-//-- uInstr1(cb, CALLM, 0, Lit16,
-//-- opc == 0x27 ? VGOFF_(helper_DAA) : VGOFF_(helper_DAS) );
-//-- uFlagsRWU(cb, FlagsAC, FlagsSZACP, FlagO);
-//-- uInstr1(cb, POP, 4, TempReg, t1);
-//-- uInstr0(cb, CALLM_E, 0);
-//-- uInstr2(cb, PUT, 1, TempReg, t1, ArchReg, R_AL);
-//-- DIP(opc == 0x27 ? "daa\n" : "das\n");
-//-- break;
-//--
-//-- case 0x37: /* AAA */
-//-- case 0x3F: /* AAS */
-//-- t1 = newTemp(cb);
-//-- uInstr2(cb, GET, 2, ArchReg, R_EAX, TempReg, t1);
-//-- /* Widen %AL to 32 bits, so it's all defined when we push it. */
-//-- uInstr1(cb, WIDEN, 4, TempReg, t1);
-//-- uWiden(cb, 2, False);
-//-- uInstr0(cb, CALLM_S, 0);
-//-- uInstr1(cb, PUSH, 4, TempReg, t1);
-//-- uInstr1(cb, CALLM, 0, Lit16,
-//-- opc == 0x37 ? VGOFF_(helper_AAA) : VGOFF_(helper_AAS) );
-//-- uFlagsRWU(cb, FlagA, FlagsAC, FlagsEmpty);
-//-- uInstr1(cb, POP, 4, TempReg, t1);
-//-- uInstr0(cb, CALLM_E, 0);
-//-- uInstr2(cb, PUT, 2, TempReg, t1, ArchReg, R_EAX);
-//-- DIP(opc == 0x37 ? "aaa\n" : "aas\n");
-//-- break;
-//--
+ /* ---------------- Misc weird-ass insns --------------- */
+
+ case 0x27: /* DAA */
+ case 0x2F: /* DAS */
+ case 0x37: /* AAA */
+ case 0x3F: /* AAS */
+ /* An ugly implementation for some ugly instructions. Oh
+ well. */
+ if (sz != 4) goto decode_failure;
+ t1 = newTemp(Ity_I32);
+ t2 = newTemp(Ity_I32);
+ /* Make up a 32-bit value (t1), with the old value of AX in the
+ bottom 16 bits, and the old OSZACP bitmask in the upper 16
+ bits. */
+ assign(t1,
+ binop(Iop_16HLto32,
+ unop(Iop_32to16,
+ mk_x86g_calculate_eflags_all()),
+ getIReg(2, R_EAX)
+ ));
+ /* Call the helper fn, to get a new AX and OSZACP value, and
+ poke both back into the guest state. Also pass the helper
+ the actual opcode so it knows which of the 4 instructions it
+ is doing the computation for. */
+ vassert(opc == 0x27 || opc == 0x2F || opc == 0x37 || opc == 0x3F);
+ assign(t2,
+ mkIRExprCCall(
+ Ity_I32, 0/*regparm*/, "x86g_calculate_daa_das_aaa_aas",
+ &x86g_calculate_daa_das_aaa_aas,
+ mkIRExprVec_2( mkexpr(t1), mkU32( opc & 0xFF) )
+ ));
+ putIReg(2, R_EAX, unop(Iop_32to16, mkexpr(t2) ));
+
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU32(X86G_CC_OP_COPY) ));
+ stmt( IRStmt_Put( OFFB_CC_DEP2, mkU32(0) ));
+ stmt( IRStmt_Put( OFFB_CC_DEP1,
+ binop(Iop_And32,
+ binop(Iop_Shr32, mkexpr(t2), mkU8(16)),
+ mkU32( X86G_CC_MASK_C | X86G_CC_MASK_P
+ | X86G_CC_MASK_A | X86G_CC_MASK_Z
+ | X86G_CC_MASK_S| X86G_CC_MASK_O )
+ )
+ )
+ );
+ /* Set NDEP even though it isn't used. This makes redundant-PUT
+ elimination of previous stores to this field work better. */
+ stmt( IRStmt_Put( OFFB_CC_NDEP, mkU32(0) ));
+ switch (opc) {
+ case 0x27: DIP("daa\n"); break;
+ case 0x2F: DIP("das\n"); break;
+ case 0x37: DIP("aaa\n"); break;
+ case 0x3F: DIP("aas\n"); break;
+ default: vassert(0);
+ }
+ break;
+
//-- case 0xD4: /* AAM */
//-- case 0xD5: /* AAD */
//-- d32 = getIByte(delta); delta++;
|
|
From: <sv...@va...> - 2007-11-23 01:42:08
|
Author: njn Date: 2007-11-23 01:42:10 +0000 (Fri, 23 Nov 2007) New Revision: 7203 Log: update Modified: trunk/NEWS Modified: trunk/NEWS =================================================================== --- trunk/NEWS 2007-11-23 01:41:32 UTC (rev 7202) +++ trunk/NEWS 2007-11-23 01:42:10 UTC (rev 7203) @@ -4,6 +4,13 @@ XXX: AIX support (ppc32 and ppc64?) +XXX: +* modestly restructured/rationalised documentation +* support for latest toolchains/libs: gcc-4.3, glibc-2.7 +* many bugs fixed, as usual +* scalability improvements (for v. large programs); some modest + performance improvements + Several large improvements to existing tools have been implemented. - Helgrind has been completely overhauled and now works for the first time |
|
From: <sv...@va...> - 2007-11-23 01:41:32
|
Author: njn
Date: 2007-11-23 01:41:32 +0000 (Fri, 23 Nov 2007)
New Revision: 7202
Log:
Fixed up the log file mess throughout, including the docs. This killed
--log-file-qualifier and --log-file-exactly.
Updated NEWS some in preparation for 3.3.0.
Modified:
trunk/NEWS
trunk/cachegrind/cg_annotate.in
trunk/cachegrind/cg_main.c
trunk/cachegrind/docs/cg-manual.xml
trunk/coregrind/m_main.c
trunk/coregrind/m_options.c
trunk/coregrind/pub_core_options.h
trunk/docs/internals/xml-output.txt
trunk/docs/xml/manual-core.xml
trunk/include/pub_tool_options.h
trunk/massif/ms_main.c
trunk/none/tests/cmdline1.stdout.exp
trunk/none/tests/cmdline2.stdout.exp
Modified: trunk/NEWS
===================================================================
--- trunk/NEWS 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/NEWS 2007-11-23 01:41:32 UTC (rev 7202)
@@ -4,13 +4,67 @@
XXX: AIX support (ppc32 and ppc64?)
-Other user-visible changes:
+Several large improvements to existing tools have been implemented.
+- Helgrind has been completely overhauled and now works for the first time
+ since Valgrind 2.2.0. [XXX: ...]
+
+- Massif has been completely overhauled. Instead of measuring space-time
+ usage -- which wasn't always useful and many people found confusing -- it
+ now measures space usage at various points in the execution, including the
+ point of peak memory allocation. Its output format has also changed:
+ instead of producing PostScript graphs and HTML text, it produces a single
+ text output (via the new 'ms_print' script) that contains both a graph and
+ the old textual information, but in a more compact and readable form.
+ Finally, the new version should be more reliable than the old one, as it
+ has been tested more thoroughly.
+
- Cachegrind has been extended to do branch-misprediction profiling.
Both conditional and indirect branches are profiled. The default
behaviour of Cachegrind is unchanged. To use the new functionality,
give the option --branch-sim=yes.
+Two new tools have also been added. These are "experimental tools", which
+means that they may not work as well as the standard tools, but they are
+included because some people will find them useful. The notion of
+experimental tools was added in order to provide a way for tools to get
+wider exposure among Valgrind users. These tools have a "exp-" prefix
+attached to their names to indicate their experimental nature.
+
+- exp-Omega [XXX ...]
+
+- exp-DRD [XXX ...]
+
+Other user-visible changes:
+
+- The --log-file-exactly and --log-file-qualifier options have been removed.
+ To make up for this --log-file option has been made more powerful and
+ flexible; it can now accept a %p format specifier, which is replaced with
+ the process ID, and the a %q{FOO} format specifier, which is replaced with
+ the contents of the environment variable $FOO.
+
+- [XXX: --child-silent-after-fork...]
+
+- There are new --cachegrind-out-file, --callgrind-out-file and
+ --massif-out-file options, which control the names of the output files
+ produced by Cachegrind, Callgrind and Massif. They accept the same %p and
+ %q format specifiers that --log-file accepts.
+
+- Cachegrind's 'cg_annotate' script no longer uses the --<pid> option to
+ specify the output file. Instead, the first non-option argument is taken
+ to be the name of the output file, and any subsequent non-option arguments
+ are taken to be the names of source files to be annotated. This change
+ was necessary due to the addition of the --cachegrind-out-file option.
+ 'callgrind_annotate' already had this behaviour.
+
+- Cachegrind now uses directory names where possible in its output files.
+ This means that the -I option to 'cg_annotate' should not be needed in
+ most cases. It also means it can correctly handle the case where two
+ source files in different directories have the same name.
+ The same is true for Callgrind and callgrind_annotate, respectively.
+ The benefits also apply to KCachegrind, without any further change
+ (ie. in most cases there is no configuration of source directories needed).
+
- A new suppression kind has been introduced: "Jump". This is for
suppressing jump-to-invalid-address errors. Previously you had to use an
"Addr1" suppression, which didn't make much sense.
@@ -26,14 +80,6 @@
traces. Second, a new option --trace-superblocks has been added, which
shows the addresses of superblocks (code blocks) as they are executed.
-- Cachegrind now uses directory names where possible in its output files.
- This means that the -I option to 'cg_annotate' should not be needed in
- most cases. It also means it can correctly handle the case where two
- source files in different directories have the same name.
- The same is true for Callgrind and callgrind_annotate, respectively.
- The benefits also apply to KCachegrind, without any further change
- (ie. in most cases there is no configuration of source directories needed).
-
Developer-visible changes:
- New debugging command line options: --debug-dump, --trace-symtab-patt...
Modified: trunk/cachegrind/cg_annotate.in
===================================================================
--- trunk/cachegrind/cg_annotate.in 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/cachegrind/cg_annotate.in 2007-11-23 01:41:32 UTC (rev 7202)
@@ -142,13 +142,11 @@
# Usage message.
my $usage = <<END
-usage: cg_annotate [options] [source-files]
+usage: cg_annotate [options] output-file [source-files]
options for the user, with defaults in [ ], are:
-h --help show this message
-v --version show version
- --<pid> read profile data from cachegrind.out.<pid>
- --cachegrind-out-file=<file> read profile data from <file>
--show=A,B,C only show figures for events A,B,C [all]
--sort=A,B,C sort columns by events A,B,C [event column order]
--threshold=<0--100> percentage of counts (of primary sort event) we
@@ -160,9 +158,6 @@
-I<d> --include=<d> add <d> to list of directories to search for
source files
- You must use either --<pid> or --cachegrind-out-file exactly once
- in order that cg_annotate knows what file to read profile data from.
-
cg_annotate is Copyright (C) 2002-2007 Nicholas Nethercote.
and licensed under the GNU General Public License, version 2.
Bug reports, feedback, admiration, abuse, etc, to: njn\@valgrind.org.
@@ -241,25 +236,6 @@
$inc =~ s|/$||; # trim trailing '/'
push(@include_dirs, "$inc/");
- # --cachegrind-out-file=<filename>
- } elsif ($arg =~ /^--cachegrind-out-file=(.*)$/) {
- if (not defined $input_file) {
- $input_file = $1;
- } else {
- die("You may only specify one input file\n" .
- "using the --<pid> and --cachegrind-out-file options.\n");
- }
-
- # --<pid>
- } elsif ($arg =~ /^--(\d+)$/) {
- my $pid = $1;
- if (not defined $input_file) {
- $input_file = "cachegrind.out.$pid";
- } else {
- die("You may only specify one input file\n" .
- "using the --<pid> and --cachegrind-out-file options.\n");
- }
-
} else { # -h and --help fall under this case
die($usage);
}
@@ -267,14 +243,20 @@
# Argument handling -- annotation file checking and selection.
# Stick filenames into a hash for quick 'n easy lookup throughout.
} else {
- my $readable = 0;
- foreach my $include_dir (@include_dirs) {
- if (-r $include_dir . $arg) {
- $readable = 1;
+ if (not defined $input_file) {
+ # First non-option argument is the output file.
+ $input_file = $arg;
+ } else {
+ # Subsequent non-option arguments are source files.
+ my $readable = 0;
+ foreach my $include_dir (@include_dirs) {
+ if (-r $include_dir . $arg) {
+ $readable = 1;
+ }
}
+ $readable or die("File $arg not found in any of: @include_dirs\n");
+ $user_ann_files{$arg} = 1;
}
- $readable or die("File $arg not found in any of: @include_dirs\n");
- $user_ann_files{$arg} = 1;
}
}
Modified: trunk/cachegrind/cg_main.c
===================================================================
--- trunk/cachegrind/cg_main.c 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/cachegrind/cg_main.c 2007-11-23 01:41:32 UTC (rev 7202)
@@ -65,8 +65,9 @@
/*--- Options ---*/
/*------------------------------------------------------------*/
-static Bool clo_cache_sim = True; /* do cache simulation? */
-static Bool clo_branch_sim = False; /* do branch simulation? */
+static Bool clo_cache_sim = True; /* do cache simulation? */
+static Bool clo_branch_sim = False; /* do branch simulation? */
+static Char* clo_cachegrind_out_file = "cachegrind.out.%p";
/*------------------------------------------------------------*/
/*--- Types and Data Structures ---*/
@@ -1255,17 +1256,9 @@
static BranchCC Bc_total;
static BranchCC Bi_total;
-// The output file base name specified by the user using the
-// --cachegrind-out-file switch. This is combined with the
-// process ID and optional user-supplied qualifier (from
-// --log-file-qualifier) to produce the name stored in
-// cachegrind_out_file.
-static Char* cachegrind_out_file_basename = "cachegrind.out";
-
-// The final, completed name for the output file.
+// The output file name. Controlled by --cachegrind-out-file.
static Char* cachegrind_out_file = NULL;
-
static void fprint_CC_table_and_calc_totals(void)
{
Int i, fd;
@@ -1691,7 +1684,7 @@
else if (VG_CLO_STREQN(5, arg, "--L2="))
parse_cache_opt(&clo_L2_cache, &arg[5]);
else if (VG_CLO_STREQN(22, arg, "--cachegrind-out-file=")) {
- cachegrind_out_file_basename = &arg[22];
+ clo_cachegrind_out_file = &arg[22];
}
else VG_BOOL_CLO(arg, "--cache-sim", clo_cache_sim)
else VG_BOOL_CLO(arg, "--branch-sim", clo_branch_sim)
@@ -1709,8 +1702,7 @@
" --L2=<size>,<assoc>,<line_size> set L2 cache manually\n"
" --cache-sim=yes|no [yes] collect cache stats?\n"
" --branch-sim=yes|no [no] collect branch prediction stats?\n"
-" --cachegrind-out-file=<file> write profile data to <file>.<pid>\n"
-" [cachegrind.out.<pid>]\n"
+" --cachegrind-out-file=<file> output file name [cachegrind.out.%%p]\n"
);
}
@@ -1725,8 +1717,6 @@
/*--- Setup ---*/
/*--------------------------------------------------------------------*/
-static Char base_dir[VKI_PATH_MAX];
-
static void cg_post_clo_init(void); /* just below */
static void cg_pre_clo_init(void)
@@ -1751,9 +1741,7 @@
static void cg_post_clo_init(void)
{
- HChar* qual = NULL;
cache_t I1c, D1c, L2c;
- Int filename_szB;
/* Can't disable both cache and branch profiling */
if ((!clo_cache_sim) && (!clo_branch_sim)) {
@@ -1764,42 +1752,10 @@
VG_(exit)(2);
}
- /* Get working directory */
- tl_assert( VG_(get_startup_wd)(base_dir, VKI_PATH_MAX) );
+ // Setup output filename.
+ cachegrind_out_file =
+ VG_(expand_file_name)("--cachegrind-out-file", clo_cachegrind_out_file);
- /* Do we have a --log-file-qualifier= to consider? */
- if (VG_(clo_log_file_qualifier)) {
- qual = VG_(getenv)(VG_(clo_log_file_qualifier));
- }
-
- /* Block is big enough for
- dir name ++ cachegrind_out_file_basename
- ++ ".<pid>"
- ++ the log file qualifier, if in use */
- filename_szB
- = VG_(strlen)(base_dir)
- + 1 /* "/" */
- + VG_(strlen)(cachegrind_out_file_basename)
- + 11 /* "." <pid>, assuming sizeof(pid) <= 4 */
- + (qual ? (10 + VG_(strlen)(qual)) : 0)
- + 1; /* to guarantee checkable zero at the end */
-
- tl_assert(filename_szB > 0);
- cachegrind_out_file
- = VG_(calloc)( sizeof(Char), filename_szB );
-
- if (qual) {
- VG_(sprintf)(cachegrind_out_file, "%s/%s.%d.lfq.%s",
- base_dir, cachegrind_out_file_basename,
- VG_(getpid)(), qual);
- } else {
- VG_(sprintf)(cachegrind_out_file, "%s/%s.%d",
- base_dir, cachegrind_out_file_basename,
- VG_(getpid)());
- }
-
- tl_assert( cachegrind_out_file[filename_szB-1] == 0 );
-
CC_table =
VG_(OSetGen_Create)(offsetof(LineCC, loc),
cmp_CodeLoc_LineCC,
Modified: trunk/cachegrind/docs/cg-manual.xml
===================================================================
--- trunk/cachegrind/docs/cg-manual.xml 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/cachegrind/docs/cg-manual.xml 2007-11-23 01:41:32 UTC (rev 7202)
@@ -78,9 +78,9 @@
command line invocation. When the program finishes,
Cachegrind will print summary cache statistics. It also
collects line-by-line information in a file
- <computeroutput>cachegrind.out.pid</computeroutput>, where
- <computeroutput>pid</computeroutput> is the program's process
- id.</para>
+ <computeroutput>cachegrind.out.<pid></computeroutput>, where
+ <computeroutput><pid></computeroutput> is the program's process
+ ID.</para>
<para>Branch prediction statistics are not collected by default.
To do so, add the flag
@@ -95,7 +95,7 @@
<listitem>
<para>Generate a function-by-function summary, and possibly
annotate source files, using the supplied
- <computeroutput>cg_annotate</computeroutput> program. Source
+ cg_annotate program. Source
files to annotate can be specified manually, or manually on
the command line, or "interesting" source files can be
annotated automatically with the
@@ -111,10 +111,9 @@
</orderedlist>
<para>As an optional intermediate step, you can use the supplied
-<computeroutput>cg_merge</computeroutput> program to sum together the
+cg_merge program to sum together the
outputs of multiple Cachegrind runs, into a single file which you then
-use as the input for
-<computeroutput>cg_annotate</computeroutput>.</para>
+use as the input for cg_annotate.</para>
<para>These steps are described in detail in the following
sections.</para>
@@ -336,46 +335,38 @@
<para>As well as printing summary information, Cachegrind also
writes line-by-line cache profiling information to a user-specified
file. By default this file is named
-<computeroutput>cachegrind.out.pid</computeroutput>. This file
+<computeroutput>cachegrind.out.<pid></computeroutput>. This file
is human-readable, but is intended to be interpreted by the accompanying
-program <computeroutput>cg_annotate</computeroutput>, described
-in the next section.</para>
+program cg_annotate, described in the next section.</para>
<para>Things to note about the
-<computeroutput>cachegrind.out.pid</computeroutput>
+<computeroutput>cachegrind.out.<pid></computeroutput>
file:</para>
<itemizedlist>
<listitem>
<para>It is written every time Cachegrind is run, and will
overwrite any existing
- <computeroutput>cachegrind.out.pid</computeroutput>
+ <computeroutput>cachegrind.out.<pid></computeroutput>
in the current directory (but that won't happen very often
because it takes some time for process ids to be
recycled).</para>
- <para>
- To use a basename other than the default
+ </listitem>
+ <listitem>
+ <para>To use an output file name other than the default
<computeroutput>cachegrind.out</computeroutput>,
use the <computeroutput>--cachegrind-out-file</computeroutput>
switch.</para>
- <para>
- To add further qualifiers to the output filename you can use
- the core's <computeroutput>--log-file-qualifier</computeroutput>
- flag. This extends the file name further with the text
- <computeroutput>.lfq.</computeroutput>followed by the
- contents of the environment variable specified by
- <computeroutput>--log-file-qualifier</computeroutput>.
- </para>
</listitem>
<listitem>
- <para>It can be huge: <computeroutput>ls -l</computeroutput>
+ <para>It can be big: <computeroutput>ls -l</computeroutput>
generates a file of about 350KB. Browsing a few files and
web pages with a Konqueror built with full debugging
information generates a file of around 15 MB.</para>
</listitem>
</itemizedlist>
-<para>The <computeroutput>.pid</computeroutput> suffix
+<para>The default <computeroutput>.<pid></computeroutput> suffix
on the output file name serves two purposes. Firstly, it means you
don't have to rename old log files that you don't want to overwrite.
Secondly, and more importantly, it allows correct profiling with the
@@ -439,13 +430,18 @@
<varlistentry id="opt.cachegrind-out-file" xreflabel="--cachegrind-out-file">
<term>
- <option><![CDATA[--cachegrind-out-file=<basename> ]]></option>
+ <option><![CDATA[--cachegrind-out-file=<file> ]]></option>
</term>
<listitem>
<para>Write the profile data to
- <computeroutput>basename.pid</computeroutput>
- rather than to the default output file,
- <computeroutput>cachegrind.out.pid</computeroutput>.
+ <computeroutput>file</computeroutput> rather than to the default
+ output file,
+ <computeroutput>cachegrind.out.<pid></computeroutput>. The
+ <option>%p</option> and <option>%q</option> format specifiers
+ can be used to embed the process ID and/or the contents of an
+ environment variable in the name, as is the case for the core
+ option <option>--log-file</option>. See <link
+ linkend="manual-core.basicopts">here</link> for details.
</para>
</listitem>
</varlistentry>
@@ -485,16 +481,12 @@
<sect2 id="cg-manual.annotate" xreflabel="Annotating C/C++ programs">
<title>Annotating C/C++ programs</title>
-<para>Before using <computeroutput>cg_annotate</computeroutput>,
+<para>Before using cg_annotate,
it is worth widening your window to be at least 120-characters
wide if possible, as the output lines can be quite long.</para>
-<para>To get a function-by-function summary, run
-<computeroutput>cg_annotate --pid</computeroutput> in a directory
-containing a <filename>cachegrind.out.pid</filename> file. The
-<emphasis>--pid</emphasis> is required so that
-<computeroutput>cg_annotate</computeroutput> knows which log file to use
-when several are present.</para>
+<para>To get a function-by-function summary, run <computeroutput>cg_annotate
+<filename></computeroutput> on a Cachegrind output file.</para>
<para>The output looks like this:</para>
@@ -643,7 +635,7 @@
</listitem>
<listitem>
- <para>Threshold: <computeroutput>cg_annotate</computeroutput>
+ <para>Threshold: cg_annotate
by default omits functions that cause very low counts
to avoid drowning you in information. In this case,
cg_annotate shows summaries the functions that account for
@@ -696,12 +688,12 @@
<para>There are two ways to annotate source files -- by choosing
them manually, or with the
<computeroutput>--auto=yes</computeroutput> option. To do it
-manually, just specify the filenames as arguments to
-<computeroutput>cg_annotate</computeroutput>. For example, the
-output from running <filename>cg_annotate concord.c</filename>
-for our example produces the same output as above followed by an
-annotated version of <filename>concord.c</filename>, a section of
-which looks like:</para>
+manually, just specify the filenames as additional arguments to
+cg_annotate. For example, the
+output from running <filename>cg_annotate <filename>
+concord.c</filename> for our example produces the same output as above
+followed by an annotated version of <filename>concord.c</filename>, a
+section of which looks like:</para>
<programlisting><![CDATA[
--------------------------------------------------------------------------------
@@ -768,7 +760,7 @@
option.</para>
<para>To get automatic annotation, run
-<computeroutput>cg_annotate --auto=yes</computeroutput>.
+<computeroutput>cg_annotate <filename> --auto=yes</computeroutput>.
cg_annotate will automatically annotate every source file it can
find that is mentioned in the function-by-function summary.
Therefore, the files chosen for auto-annotation are affected by
@@ -798,7 +790,7 @@
information aren't specific enough.</para>
<para>Beware that cg_annotate can take some time to digest large
-<computeroutput>cachegrind.out.pid</computeroutput> files,
+<computeroutput>cachegrind.out.<pid></computeroutput> files,
e.g. 30 seconds or more. Also beware that auto-annotation can
produce a lot of output if your program is large!</para>
@@ -806,10 +798,10 @@
<sect2 id="cg-manual.assembler" xreflabel="Annotating assembler programs">
-<title>Annotating assembler programs</title>
+<title>Annotating assembly code programs</title>
-<para>Valgrind can annotate assembler programs too, or annotate
-the assembler generated for your C program. Sometimes this is
+<para>Valgrind can annotate assembly code programs too, or annotate
+the assembly code generated for your C program. Sometimes this is
useful for understanding what is really happening when an
interesting line of C code is translated into multiple
instructions.</para>
@@ -832,34 +824,10 @@
<sect1 id="cg-manual.annopts" xreflabel="cg_annotate options">
-<title><computeroutput>cg_annotate</computeroutput> options</title>
+<title>cg_annotate options</title>
<itemizedlist>
- <listitem id="pid">
- <para><computeroutput>--pid</computeroutput></para>
- <para>Indicates that profile data should be read from
- the file
- <computeroutput>cachegrind.out.pid</computeroutput>.
- read.
- Note that you must specify either
- <computeroutput>--pid</computeroutput>
- or <computeroutput>--cachegrind-out-file=filename</computeroutput>
- exactly once.
- </para>
- </listitem>
-
- <listitem id="cachegrind-out-file">
- <para><computeroutput>--cachegrind-out-file=filename</computeroutput></para>
- <para>Indicates that profile data
- should be read from <computeroutput>filename</computeroutput>.
- Note that you must specify either
- <computeroutput>--pid</computeroutput>
- or <computeroutput>--cachegrind-out-file=filename</computeroutput>
- exactly once.
- </para>
- </listitem>
-
<listitem>
<para><computeroutput>-h, --help</computeroutput></para>
<para><computeroutput>-v, --version</computeroutput></para>
@@ -869,7 +837,7 @@
<listitem id="sort">
<para><computeroutput>--sort=A,B,C</computeroutput> [default:
order in
- <computeroutput>cachegrind.out.pid</computeroutput>]</para>
+ <computeroutput>cachegrind.out.<pid></computeroutput>]</para>
<para>Specifies the events upon which the sorting of the
function-by-function entries will be based. Useful if you
want to concentrate on eg. I cache misses
@@ -883,10 +851,10 @@
<listitem id="show">
<para><computeroutput>--show=A,B,C</computeroutput> [default:
all, using order in
- <computeroutput>cachegrind.out.pid</computeroutput>]</para>
+ <computeroutput>cachegrind.out.<pid></computeroutput>]</para>
<para>Specifies which events to show (and the column
order). Default is to use all present in the
- <computeroutput>cachegrind.out.pid</computeroutput> file (and
+ <computeroutput>cachegrind.out.<pid></computeroutput> file (and
use the order in the file).</para>
</listitem>
@@ -941,15 +909,14 @@
<title>Warnings</title>
<para>There are a couple of situations in which
-<computeroutput>cg_annotate</computeroutput> issues
-warnings.</para>
+cg_annotate issues warnings.</para>
<itemizedlist>
<listitem>
<para>If a source file is more recent than the
- <computeroutput>cachegrind.out.pid</computeroutput> file.
+ <computeroutput>cachegrind.out.<pid></computeroutput> file.
This is because the information in
- <computeroutput>cachegrind.out.pid</computeroutput> is only
+ <computeroutput>cachegrind.out.<pid></computeroutput> is only
recorded with line numbers, so if the line numbers change at
all in the source (eg. lines added, deleted, swapped), any
annotations will be incorrect.</para>
@@ -958,7 +925,7 @@
<para>If information is recorded about line numbers past the
end of a file. This can be caused by the above problem,
ie. shortening the source file while using an old
- <computeroutput>cachegrind.out.pid</computeroutput> file. If
+ <computeroutput>cachegrind.out.<pid></computeroutput> file. If
this happens, the figures for the bogus lines are printed
anyway (clearly marked as bogus) in case they are
important.</para>
@@ -1167,22 +1134,21 @@
<sect1 id="cg-manual.cg_merge" xreflabel="cg_merge">
-<title>Merging profiles with <computeroutput>cg_merge</computeroutput></title>
+<title>Merging profiles with cg_merge</title>
<para>
-<computeroutput>cg_merge</computeroutput> is a simple program which
+cg_merge is a simple program which
reads multiple profile files, as created by cachegrind, merges them
together, and writes the results into another file in the same format.
You can then examine the merged results using
-<computeroutput>cg_annotate
---cachegrind-out-file=outputfile</computeroutput>, as
+<computeroutput>cg_annotate <filename></computeroutput>, as
described above. The merging functionality might be useful if you
want to aggregate costs over multiple runs of the same program, or
from a single parallel run with multiple instances of the same
program.</para>
<para>
-<computeroutput>cg_merge</computeroutput> is invoked as follows:
+cg_merge is invoked as follows:
</para>
<programlisting><![CDATA[
@@ -1203,7 +1169,7 @@
since any file mentioned twice will be added in twice.</para>
<para>
-<computeroutput>cg_merge</computeroutput> does not attempt to check
+cg_merge does not attempt to check
that the input files come from runs of the same executable. It will
happily merge together profile files from completely unrelated
programs. It does however check that the
@@ -1215,7 +1181,7 @@
<para>
A number of other syntax and sanity checks are done whilst reading the
-inputs. <computeroutput>cg_merge</computeroutput> will stop and
+inputs. cg_merge will stop and
attempt to print a helpful error message if any of the input files
fail these checks.</para>
Modified: trunk/coregrind/m_main.c
===================================================================
--- trunk/coregrind/m_main.c 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/coregrind/m_main.c 2007-11-23 01:41:32 UTC (rev 7202)
@@ -121,9 +121,7 @@
" --track-fds=no|yes track open file descriptors? [no]\n"
" --time-stamp=no|yes add timestamps to log messages? [no]\n"
" --log-fd=<number> log messages to file descriptor [2=stderr]\n"
-" --log-file=<file> log messages to <file>.<pid>\n"
-" --log-file-exactly=<file> log messages to <file>\n"
-" --log-file-qualifier=<VAR> incorporate $VAR in logfile name [none]\n"
+" --log-file=<file> log messages to <file>\n"
" --log-socket=ipaddr:port log messages to socket ipaddr:port\n"
"\n"
" uncommon user options for all Valgrind tools:\n"
@@ -293,7 +291,6 @@
enum {
VgLogTo_Fd,
VgLogTo_File,
- VgLogTo_FileExactly,
VgLogTo_Socket
} log_to = VgLogTo_Fd; // Where is logging output to be sent?
@@ -435,15 +432,6 @@
VG_(clo_log_name) = &arg[11];
}
- else if (VG_CLO_STREQN(21, arg, "--log-file-qualifier=")) {
- VG_(clo_log_file_qualifier) = &arg[21];
- }
-
- else if (VG_CLO_STREQN(19, arg, "--log-file-exactly=")) {
- log_to = VgLogTo_FileExactly;
- VG_(clo_log_name) = &arg[19];
- }
-
else if (VG_CLO_STREQN(13, arg, "--log-socket=")) {
log_to = VgLogTo_Socket;
VG_(clo_log_name) = &arg[13];
@@ -601,80 +589,27 @@
break;
case VgLogTo_File: {
- HChar logfilename[1000];
- Int seq = 0;
- Int pid = VG_(getpid)();
- HChar* qual = NULL;
+ Char* logfilename;
vg_assert(VG_(clo_log_name) != NULL);
vg_assert(VG_(strlen)(VG_(clo_log_name)) <= 900); /* paranoia */
- if (VG_(clo_log_file_qualifier)) {
- qual = VG_(getenv)(VG_(clo_log_file_qualifier));
- }
-
- for (;;) {
- HChar pidtxt[20], seqtxt[20];
-
- VG_(sprintf)(pidtxt, "%d", pid);
-
- if (seq == 0)
- seqtxt[0] = 0;
- else
- VG_(sprintf)(seqtxt, ".%d", seq);
-
- seq++;
-
- /* Result:
- if (qual) base_name ++ "." ++ qual ++ seqtxt
- if (not qual) base_name ++ "." ++ pid ++ seqtxt
- */
- VG_(sprintf)( logfilename,
- "%s.%s%s",
- VG_(clo_log_name),
- qual ? qual : pidtxt,
- seqtxt );
-
- // EXCL: it will fail with EEXIST if the file already exists.
- sres = VG_(open)(logfilename,
- VKI_O_CREAT|VKI_O_WRONLY|VKI_O_EXCL|VKI_O_TRUNC,
- VKI_S_IRUSR|VKI_S_IWUSR);
- if (!sres.isError) {
- tmp_log_fd = sres.res;
- break; /* for (;;) */
- } else {
- // If the file already existed, we try the next name. If it
- // was some other file error, we give up.
- if (sres.err != VKI_EEXIST) {
- VG_(message)(Vg_UserMsg,
- "Can't create log file '%s' (%s); giving up!",
- logfilename, VG_(strerror)(sres.err));
- VG_(err_bad_option)(
- "--log-file=<file> (didn't work out for some reason.)");
- /*NOTREACHED*/
- }
- }
- }
- break; /* switch (VG_(clo_log_to)) */
- }
-
- case VgLogTo_FileExactly: {
- vg_assert(VG_(clo_log_name) != NULL);
- vg_assert(VG_(strlen)(VG_(clo_log_name)) <= 900); /* paranoia */
-
- sres = VG_(open)(VG_(clo_log_name),
+ // Nb: we overwrite an existing file of this name without asking
+ // any questions.
+ logfilename = VG_(expand_file_name)("--log-file", VG_(clo_log_name));
+ sres = VG_(open)(logfilename,
VKI_O_CREAT|VKI_O_WRONLY|VKI_O_TRUNC,
VKI_S_IRUSR|VKI_S_IWUSR);
if (!sres.isError) {
tmp_log_fd = sres.res;
} else {
VG_(message)(Vg_UserMsg,
- "Can't create/open log file '%s'; giving up!",
- VG_(clo_log_name));
+ "Can't create log file '%s' (%s); giving up!",
+ logfilename, VG_(strerror)(sres.err));
VG_(err_bad_option)(
- "--log-file-exactly=<file> (didn't work out for some reason.)");
+ "--log-file=<file> (didn't work out for some reason.)");
/*NOTREACHED*/
- }
+ }
break; /* switch (VG_(clo_log_to)) */
}
@@ -838,13 +773,6 @@
VG_(message)(Vg_UserMsg,
" %s",
* (HChar**) VG_(indexXA)( VG_(args_for_client), i ));
- if (VG_(clo_log_file_qualifier)) {
- HChar* val = VG_(getenv)(VG_(clo_log_file_qualifier));
- VG_(message)(Vg_UserMsg, "");
- VG_(message)(Vg_UserMsg, "Log file qualifier: var %s, value %s.",
- VG_(clo_log_file_qualifier),
- val ? val : "");
- }
}
else
if (VG_(clo_xml)) {
@@ -852,13 +780,16 @@
VG_(message)(Vg_UserMsg, "<pid>%d</pid>", VG_(getpid)());
VG_(message)(Vg_UserMsg, "<ppid>%d</ppid>", VG_(getppid)());
VG_(message)(Vg_UserMsg, "<tool>%t</tool>", toolname);
- if (VG_(clo_log_file_qualifier)) {
- HChar* val = VG_(getenv)(VG_(clo_log_file_qualifier));
- VG_(message)(Vg_UserMsg, "<logfilequalifier> <var>%t</var> "
- "<value>%t</value> </logfilequalifier>",
- VG_(clo_log_file_qualifier),
- val ? val : "");
- }
+// [This was made obsolete by the --log-file change in 3.3.0. But
+// I'm leaving it here (commented out) in case it needs to be reinstated in
+// some way --njn]
+// if (VG_(clo_log_file_qualifier)) {
+// HChar* val = VG_(getenv)(VG_(clo_log_file_qualifier));
+// VG_(message)(Vg_UserMsg, "<logfilequalifier> <var>%t</var> "
+// "<value>%t</value> </logfilequalifier>",
+// VG_(clo_log_file_qualifier),
+// val ? val : "");
+// }
if (VG_(clo_xml_user_comment)) {
/* Note: the user comment itself is XML and is therefore to
be passed through verbatim (%s) rather than escaped
@@ -1630,7 +1561,6 @@
// Print the preamble
// p: tl_pre_clo_init [for 'VG_(details).name' and friends]
// p: process_cmd_line_options() [for VG_(clo_verbosity), VG_(clo_xml),
- // VG_(clo_log_file_qualifier),
// logging_to_fd]
//--------------------------------------------------------------
VG_(debugLog)(1, "main", "Print the preamble...\n");
Modified: trunk/coregrind/m_options.c
===================================================================
--- trunk/coregrind/m_options.c 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/coregrind/m_options.c 2007-11-23 01:41:32 UTC (rev 7202)
@@ -30,9 +30,14 @@
*/
#include "pub_core_basics.h"
+#include "pub_core_vki.h"
#include "pub_core_options.h"
#include "pub_core_libcassert.h"
+#include "pub_core_libcbase.h"
+#include "pub_core_libcfile.h"
#include "pub_core_libcprint.h"
+#include "pub_core_libcproc.h"
+#include "pub_core_mallocfree.h"
// See pub_{core,tool}_options.h for explanations of all these.
@@ -53,7 +58,6 @@
Bool VG_(clo_child_silent_after_fork) = False;
Int VG_(clo_log_fd) = 2; /* must be signed, as -1 is possible. */
Char* VG_(clo_log_name) = NULL;
-Char* VG_(clo_log_file_qualifier) = NULL;
Bool VG_(clo_time_stamp) = False;
Int VG_(clo_input_fd) = 0; /* stdin */
Int VG_(clo_n_suppressions) = 0;
@@ -123,7 +127,112 @@
VG_(exit)(1);
}
+// Copies the string, prepending it with the startup working directory, and
+// expanding %p and %q entries. Returns a new, malloc'd string.
+Char* VG_(expand_file_name)(Char* option_name, Char* format)
+{
+ static Char base_dir[VKI_PATH_MAX];
+ Int len, i = 0, j = 0;
+ Char* out;
+ Bool ok = VG_(get_startup_wd)(base_dir, VKI_PATH_MAX);
+ tl_assert(ok);
+
+ if (VG_STREQ(format, "")) {
+ // Empty name, bad.
+ VG_(message)(Vg_UserMsg, "%s: filename is empty", option_name);
+ goto bad;
+ }
+
+ // The 10 is slop, it should be enough in most cases.
+ j = VG_(strlen)(base_dir);
+ len = j + VG_(strlen)(format) + 10;
+ out = VG_(malloc)( len );
+ VG_(strcpy)(out, base_dir);
+
+#define ENSURE_THIS_MUCH_SPACE(x) \
+ if (j + x >= len) { \
+ len += (10 + x); \
+ out = VG_(realloc)(out, len); \
+ }
+
+ out[j++] = '/';
+ while (format[i]) {
+ if (format[i] != '%') {
+ ENSURE_THIS_MUCH_SPACE(1);
+ out[j++] = format[i++];
+
+ } else {
+ // We saw a '%'. What's next...
+ i++;
+ if ('%' == format[i]) {
+ // Replace '%%' with '%'.
+ ENSURE_THIS_MUCH_SPACE(1);
+ out[j++] = format[i++];
+ }
+ else if ('p' == format[i]) {
+ // Print the PID. Assume that it's not longer than 10 chars --
+ // reasonable since 'pid' is an Int (ie. 32 bits).
+ Int pid = VG_(getpid)();
+ ENSURE_THIS_MUCH_SPACE(10);
+ j += VG_(sprintf)(&out[j], "%d", pid);
+ i++;
+ }
+ else if ('q' == format[i] && '{' == format[i+1]) {
+ // Get the env var name, print its contents.
+ Char* qualname;
+ Char* qual;
+ i += 2;
+ qualname = &format[i];
+ while (True) {
+ if (0 == format[i]) {
+ VG_(message)(Vg_UserMsg, "%s: malformed %%q specifier",
+ option_name);
+ goto bad;
+ } else if ('}' == format[i]) {
+ // Temporarily replace the '}' with NUL to extract var name.
+ format[i] = 0;
+ qual = VG_(getenv)(qualname);
+ if (NULL == qual) {
+ VG_(message)(Vg_UserMsg,
+ "%s: environment variable %s is not set",
+ option_name, qualname);
+ goto bad;
+ }
+ format[i] = '}'; // Put the '}' back.
+ i++;
+ break;
+ }
+ i++;
+ }
+ ENSURE_THIS_MUCH_SPACE(VG_(strlen)(qual));
+ j += VG_(sprintf)(&out[j], "%s", qual);
+ }
+ else {
+ // Something else, abort.
+ VG_(message)(Vg_UserMsg,
+ "%s: expected 'p' or 'q' or '%%' after '%%'", option_name);
+ goto bad;
+ }
+ }
+ }
+ ENSURE_THIS_MUCH_SPACE(1);
+ out[j++] = 0;
+
+ return out;
+
+ bad: {
+ Char* opt = // 2: 1 for the '=', 1 for the NUL.
+ VG_(malloc)( VG_(strlen)(option_name) + VG_(strlen)(format) + 2 );
+ VG_(strcpy)(opt, option_name);
+ VG_(strcat)(opt, "=");
+ VG_(strcat)(opt, format);
+ VG_(err_bad_option)(opt);
+ }
+}
+
+
+
/*--------------------------------------------------------------------*/
/*--- end m_options.c ---*/
/*--------------------------------------------------------------------*/
Modified: trunk/coregrind/pub_core_options.h
===================================================================
--- trunk/coregrind/pub_core_options.h 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/coregrind/pub_core_options.h 2007-11-23 01:41:32 UTC (rev 7202)
@@ -74,17 +74,12 @@
taken from the command line. (fd 2, stderr, is the default.)
clo_log_name is irrelevant.
- With --log-file/--log-file-exactly, clo_log_name holds the log-file
- name, and is taken from the command line. clo_log_fd is then
- made to hold the relevant file id, by opening clo_log_name
- (concatenated with the process ID) for writing.
+ With --log-file, clo_log_name holds the log-file name, and is taken from
+ the command line (and possibly has process ID/env var contents in it, if
+ the %p or %q format specifiers are used). clo_log_fd is then made to
+ hold the relevant file id, by opening clo_log_name (concatenated with the
+ process ID) for writing.
- With --log-file, there is an additional twist: if
- clo_log_file_qualifier is non-NULL, the contents of the environment
- variable specified by clo_log_file_qualifier is incorporated into
- the logfile name. This is useful in that it allows the logfile
- name to incorporate environmental information.
-
With --log-socket, clo_log_name holds the hostname:portnumber pair,
and is taken from the command line. clo_log_fd is then made to hold
the relevant file handle, by opening a connection to that
@@ -94,7 +89,6 @@
(stderr). */
extern Int VG_(clo_log_fd);
extern Char* VG_(clo_log_name);
-/* extern Char* VG_(clo_log_file_qualifier); moved to pub_tool_options.h */
/* Add timestamps to log messages? default: NO */
extern Bool VG_(clo_time_stamp);
Modified: trunk/docs/internals/xml-output.txt
===================================================================
--- trunk/docs/internals/xml-output.txt 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/docs/internals/xml-output.txt 2007-11-23 01:41:32 UTC (rev 7202)
@@ -154,6 +154,8 @@
That is, both the name of the environment variable and its value
are given.
+ [update: as of v3.3.0, this is not present, as the --log-file-qualifier
+ option has been removed, replaced by the %q format specifier in --log-file.]
* OPTIONALLY, if --xml-user-comment=STRING was given:
Modified: trunk/docs/xml/manual-core.xml
===================================================================
--- trunk/docs/xml/manual-core.xml 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/docs/xml/manual-core.xml 2007-11-23 01:41:32 UTC (rev 7202)
@@ -191,32 +191,12 @@
<listitem id="manual-core.out2file"
xreflabel="Directing output to file"> <para>A less intrusive
option is to write the commentary to a file, which you specify by
- <option>--log-file=filename</option>. Note carefully that the
- commentary is <command>not</command> written to the file you
- specify, but instead to one called
- <filename>filename.12345</filename>, if for example the pid of the
- traced process is 12345. This is helpful when Valgrinding a whole
- tree of processes at once, since it means that each process writes
- to its own logfile, rather than the result being jumbled up in one
- big logfile. If <filename>filename.12345</filename> already exists,
- then it will name new files <filename>filename.12345.1</filename>
- and so on.</para>
-
- <para>If you want to specify precisely the file name to use, without
- the trailing <computeroutput>.12345</computeroutput> part, you can
- instead use <option>--log-file-exactly=filename</option>.</para>
-
- <para>You can also use the
- <option>--log-file-qualifier=<VAR></option> option to
- incorporate into the filename the contents of environment variable
- <varname>VAR</varname>. This is rarely needed, but very useful in
- certain circumstances (eg. when running MPI programs). In this
- case, the trailing <computeroutput>.12345</computeroutput> part is
- replaced by (the contents of) <varname>$VAR</varname>. The idea is
- that you specify a variable which will be set differently for each
- process in the job, for example
- <computeroutput>BPROC_RANK</computeroutput> or whatever is
- applicable in your MPI setup.</para>
+ <option>--log-file=filename</option>. There are special format
+ specifiers that can be used to use a process ID or an environment
+ variable name in the log file name. These are useful/necessary if your
+ program invokes multiple processes (especially for MPI programs).
+ See the <link linkend="manual-core.basicopts">basic options section</link>
+ for more details.</para>
</listitem>
<listitem id="manual-core.out2socket"
@@ -720,40 +700,34 @@
</term>
<listitem>
<para>Specifies that Valgrind should send all of its messages to
- the specified file. In fact, the file name used is created by
- concatenating the text <filename>filename</filename>, "." and the
- process ID, (ie. <![CDATA[<filename>.<pid>]]>), so as to create a
- file per process. The specified file name may not be the empty
- string.</para>
- </listitem>
- </varlistentry>
+ the specified file. If the file name is empty, it causes an abort.
+ There are three special format specifiers that can be used in the file
+ name.</para>
- <varlistentry id="opt.log-file-exactly" xreflabel="--log-file-exactly">
- <term>
- <option><![CDATA[--log-file-exactly=<filename> ]]></option>
- </term>
- <listitem>
- <para>Just like <option>--log-file</option>, but the suffix
- <computeroutput>".pid"</computeroutput> is not added. WARNING: If you
- use this option with <option>--trace-children=yes</option> and your
- program invokes multiple processes, the Valgrind output from all those
- processes will go into this one file, possibly jumbled up, and
+ <para><option>%p</option> is replaced with the current process ID.
+ This is very useful for program that invoke multiple processes.
+ WARNING: If you use <option>--trace-children=yes</option> and your
+ program invokes multiple processes and you don't use this specifier
+ (or the <option>%q</option> specifier below), the Valgrind output from
+ all those processes will go into one file, possibly jumbled up, and
possibly incomplete.</para>
- </listitem>
- </varlistentry>
- <varlistentry id="opt.log-file-qualifier" xreflabel="--log-file-qualifier">
- <term>
- <option><![CDATA[--log-file-qualifier=<VAR> ]]></option>
- </term>
- <listitem>
- <para>When used in conjunction with <option>--log-file</option>,
- causes the log file name to be qualified using the contents of the
- environment variable <computeroutput>$VAR</computeroutput>. This
- is useful when running MPI programs. For further details, see
- <link linkend="manual-core.comment">the commentary</link>
- in the manual.
- </para>
+ <para><option>%q{FOO}</option> is replaced with the contents of the
+ environment variable <varname>FOO</varname>. If the
+ <option>{FOO}</option> part is malformed, it causes an abort. This
+ specifier is rarely needed, but very useful in certain circumstances
+ (eg. when running MPI programs). The idea is that you specify a
+ variable which will be set differently for each process in the job,
+ for example <computeroutput>BPROC_RANK</computeroutput> or whatever is
+ applicable in your MPI setup. If the named environment variable is not
+ set, it causes an abort. Note that in some shells, the
+ <option>{</option> and <option>}</option> characters may need to be
+ escaped with a backslash.</para>
+
+ <para><option>%%</option> is replaced with <option>%</option>.</para>
+
+ <para>If an <option>%</option> is followed by any other character, it
+ causes an abort.</para>
</listitem>
</varlistentry>
Modified: trunk/include/pub_tool_options.h
===================================================================
--- trunk/include/pub_tool_options.h 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/include/pub_tool_options.h 2007-11-23 01:41:32 UTC (rev 7202)
@@ -110,11 +110,6 @@
XML output, in between <usercomment> tags. */
extern HChar* VG_(clo_xml_user_comment);
-/* Name of an environment variable which, if set, is to be used as
- part of any output file name. See pub_core_options.h for
- details. */
-extern Char* VG_(clo_log_file_qualifier);
-
/* Vex iropt control. Tool-visible so tools can make Vex optimise
less aggressively if that is needed (callgrind needs this). */
extern VexControl VG_(clo_vex_control);
@@ -127,6 +122,16 @@
__attribute__((noreturn))
extern void VG_(err_bad_option) ( Char* opt );
+/* Used to expand file names. 'option_name" is the option name, eg.
+ "--log-file". 'format' is what follows, eg. "cachegrind.out.%p". In
+ 'format':
+ - "%p" is replaced with PID.
+ - "%q{QUAL}" is replaced with the environment variable $QUAL. If $QUAL
+ isn't set, we abort. If the "{QUAL}" part is malformed, we abort.
+ - "%%" is replaced with "%".
+ Anything else after '%' causes an abort.
+*/
+extern Char* VG_(expand_file_name)(Char* option_name, Char* format);
#endif // __PUB_TOOL_OPTIONS_H
Modified: trunk/massif/ms_main.c
===================================================================
--- trunk/massif/ms_main.c 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/massif/ms_main.c 2007-11-23 01:41:32 UTC (rev 7202)
@@ -36,24 +36,8 @@
// - do a graph-drawing test
// - write a good basic test that shows how the tool works, suitable for
// documentation
-// - do filename properly, clean up Valgrind-wide log file naming mess.
-// Expected behaviour:
-// - Main log file:
-// default --> stderr
-// --log-file=X --> X.<pid>
-// --log-file-exactly=X --> X
-// --log-file-qualifier=QUAL --> [error]
-// --log-file=X --log-file-qualifier=QUAL --> X.$QUAL
-// - Massif out file:
-// default --> cachegrind.out.<pid>
-// --cg-out-file=X --> X.<pid>
-// --cg-out-file-exactly=X --> X
-// --cg-out-file-qualifier=QUAL --> [error]
-// --cg-out-file=X --cg-out-file-qualifier=QUAL --> X.$QUAL
-// - Likewise for Cachegrind, but with --cg-out/cg.out.
-// - And in cg_annotate, remove the --<pid> option.
-// - Likewise for Callgrind, but with --cl-out/cl.out (?)
-// - And don't create .1, .2 etc suffixed files.
+// - In cg_annotate, remove the --<pid> option.
+// - Get Josef to update the Callgrind --callgrind-out-file option.
//
// Todo -- nice, but less critical:
// - make file format more generic. Obstacles:
@@ -326,9 +310,6 @@
// memory. An alternative to milliseconds as a unit of program "time".
static ULong total_allocs_deallocs_szB = 0;
-// The output file name. Controlled by --massif-out-file.
-static Char* massif_out_file = NULL;
-
// We don't start taking snapshots until the first basic block is executed,
// rather than doing it in ms_post_clo_init (which is the obvious spot), for
// two reasons.
@@ -476,7 +457,7 @@
" alloc'd/dealloc'd on the heap [ms]\n"
" --detailed-freq=<N> every Nth snapshot should be detailed [10]\n"
" --max-snapshots=<N> maximum number of snapshots recorded [100]\n"
-" --massif-out-file=<s> output file name [massif.out.%%p]\n"
+" --massif-out-file=<file> output file name [massif.out.%%p]\n"
);
VG_(replacement_malloc_print_usage)();
}
@@ -1815,6 +1796,9 @@
//--- Writing snapshots ---//
//------------------------------------------------------------//
+// The output file name. Controlled by --massif-out-file.
+static Char* massif_out_file = NULL;
+
#define FP_BUF_SIZE 1024
Char FP_buf[FP_BUF_SIZE];
@@ -2052,105 +2036,6 @@
//--- Initialisation ---//
//------------------------------------------------------------//
-// Copies the string, prepending it with the startup working directory, and
-// expanding %p and %q entries. Returns a new, malloc'd string.
-static Char* VG_(expand_file_name)(Char* option_name, Char* format)
-{
- static Char base_dir[VKI_PATH_MAX];
- Int len, i = 0, j = 0;
- Char* out;
-
- Bool ok = VG_(get_startup_wd)(base_dir, VKI_PATH_MAX);
- tl_assert(ok);
-
- // The 10 is slop, it should be enough in most cases.
- j = VG_(strlen)(base_dir);
- len = j + VG_(strlen)(format) + 10;
- out = VG_(malloc)( len );
- VG_(strcpy)(out, base_dir);
-
-#define ENSURE_THIS_MUCH_SPACE(x) \
- if (j + x >= len) { \
- len += (10 + x); \
- out = VG_(realloc)(out, len); \
- }
-
- out[j++] = '/';
- while (format[i]) {
- if (format[i] != '%') {
- ENSURE_THIS_MUCH_SPACE(1);
- out[j++] = format[i++];
-
- } else {
- // We saw a '%'. What's next...
- i++;
- if ('%' == format[i]) {
- // Replace '%%' with '%'.
- ENSURE_THIS_MUCH_SPACE(1);
- out[j++] = format[i++];
- }
- else if ('p' == format[i]) {
- // Print the PID. Assume that it's not longer than 10 chars --
- // reasonable since 'pid' is an Int (ie. 32 bits).
- Int pid = VG_(getpid)();
- ENSURE_THIS_MUCH_SPACE(10);
- j += VG_(sprintf)(&out[j], "%d", pid);
- i++;
- }
- else if ('q' == format[i] && '{' == format[i+1]) {
- // Get the env var name, print its contents.
- Char* qualname;
- Char* qual;
- i += 2;
- qualname = &format[i];
- while (True) {
- if (0 == format[i]) {
- VG_(message)(Vg_UserMsg, "%s: malformed %%q specifier",
- option_name);
- goto bad;
- } else if ('}' == format[i]) {
- // Temporarily replace the '}' with NUL to extract var name.
- format[i] = 0;
- qual = VG_(getenv)(qualname);
- if (NULL == qual) {
- VG_(message)(Vg_UserMsg,
- "%s: environment variable %s is not set",
- option_name, qualname);
- goto bad;
- }
- format[i] = '}'; // Put the '}' back.
- i++;
- break;
- }
- i++;
- }
- ENSURE_THIS_MUCH_SPACE(VG_(strlen)(qual));
- j += VG_(sprintf)(&out[j], "%s", qual);
- }
- else {
- // Something else, abort.
- VG_(message)(Vg_UserMsg,
- "%s: expected 'p' or 'q' or '%%' after '%%'", option_name);
- goto bad;
- }
- }
- }
- ENSURE_THIS_MUCH_SPACE(1);
- out[j++] = 0;
-
- return out;
-
- bad: {
- Char* opt = // 2: 1 for the '=', 1 for the NUL.
- VG_(malloc)( VG_(strlen)(option_name) + VG_(strlen)(format) + 2 );
- VG_(strcpy)(opt, option_name);
- VG_(strcat)(opt, "=");
- VG_(strcat)(opt, format);
- VG_(err_bad_option)(opt);
- }
-}
-
-
static void ms_post_clo_init(void)
{
Int i;
Modified: trunk/none/tests/cmdline1.stdout.exp
===================================================================
--- trunk/none/tests/cmdline1.stdout.exp 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/none/tests/cmdline1.stdout.exp 2007-11-23 01:41:32 UTC (rev 7202)
@@ -7,13 +7,12 @@
--version show version
-q --quiet run silently; only print error msgs
-v --verbose be more verbose, incl counts of errors
- --trace-children=no|yes Valgrind-ise child processes? [no]
+ --trace-children=no|yes Valgrind-ise child processes (follow execve)? [no]
+ --child-silent-after-fork=no|yes omit child output between fork & exec? [no]
--track-fds=no|yes track open file descriptors? [no]
--time-stamp=no|yes add timestamps to log messages? [no]
--log-fd=<number> log messages to file descriptor [2=stderr]
- --log-file=<file> log messages to <file>.<pid>
- --log-file-exactly=<file> log messages to <file>
- --log-file-qualifier=<VAR> incorporate $VAR in logfile name [none]
+ --log-file=<file> log messages to <file>
--log-socket=ipaddr:port log messages to socket ipaddr:port
uncommon user options for all Valgrind tools:
Modified: trunk/none/tests/cmdline2.stdout.exp
===================================================================
--- trunk/none/tests/cmdline2.stdout.exp 2007-11-22 23:33:20 UTC (rev 7201)
+++ trunk/none/tests/cmdline2.stdout.exp 2007-11-23 01:41:32 UTC (rev 7202)
@@ -7,13 +7,12 @@
--version show version
-q --quiet run silently; only print error msgs
-v --verbose be more verbose, incl counts of errors
- --trace-children=no|yes Valgrind-ise child processes? [no]
+ --trace-children=no|yes Valgrind-ise child processes (follow execve)? [no]
+ --child-silent-after-fork=no|yes omit child output between fork & exec? [no]
--track-fds=no|yes track open file descriptors? [no]
--time-stamp=no|yes add timestamps to log messages? [no]
--log-fd=<number> log messages to file descriptor [2=stderr]
- --log-file=<file> log messages to <file>.<pid>
- --log-file-exactly=<file> log messages to <file>
- --log-file-qualifier=<VAR> incorporate $VAR in logfile name [none]
+ --log-file=<file> log messages to <file>
--log-socket=ipaddr:port log messages to socket ipaddr:port
uncommon user options for all Valgrind tools:
|
|
From: <js...@ac...> - 2007-11-23 01:21:15
|
Nightly build on g5 ( SuSE 10.1, ppc970 ) started at 2007-11-23 02:00:01 CET 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 == 285 tests, 25 stderr failures, 4 stdout failures, 0 post failures == memcheck/tests/deep_templates (stdout) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/pointer-trace (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) none/tests/fdleak_cmsg (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) 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/tc07_hbl1 (stderr) helgrind/tests/tc08_hbl2 (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc11_XCHG (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) |