|
From: <sv...@va...> - 2008-01-20 22:30:55
|
Author: njn
Date: 2008-01-20 22:30:52 +0000 (Sun, 20 Jan 2008)
New Revision: 7355
Log:
When truncating long lines in the output file, make sure they end with a
newline. Fixes bug #155929.
Added:
trunk/massif/tests/long-names.c
trunk/massif/tests/long-names.post.exp
trunk/massif/tests/long-names.stderr.exp
trunk/massif/tests/long-names.vgtest
Modified:
trunk/massif/ms_main.c
trunk/massif/tests/Makefile.am
Modified: trunk/massif/ms_main.c
===================================================================
--- trunk/massif/ms_main.c 2008-01-18 07:42:01 UTC (rev 7354)
+++ trunk/massif/ms_main.c 2008-01-20 22:30:52 UTC (rev 7355)
@@ -774,6 +774,11 @@
#define MAX_OVERESTIMATE 50
#define MAX_IPS (MAX_DEPTH + MAX_OVERESTIMATE)
+// This is used for various buffers which can hold function names/IP
+// description. Some C++ names can get really long so 1024 isn't big
+// enough.
+#define BUF_LEN 2048
+
// Get the stack trace for an XCon, filtering out uninteresting entries:
// alloc-fns and entries above alloc-fns, and entries below main-or-below-main.
// Eg: alloc-fn1 / alloc-fn2 / a / b / main / (below main) / c
@@ -783,7 +788,6 @@
static
Int get_IPs( ThreadId tid, Bool is_custom_alloc, Addr ips[])
{
- #define BUF_LEN 1024
Char buf[BUF_LEN];
Int n_ips, i, n_alloc_fns_removed;
Int overestimate;
@@ -1863,16 +1867,28 @@
// 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];
+Char FP_buf[BUF_LEN];
// XXX: implement f{,n}printf in m_libcprint.c eventually, and use it here.
// Then change Cachegrind to use it too.
#define FP(format, args...) ({ \
- VG_(snprintf)(FP_buf, FP_BUF_SIZE, format, ##args); \
+ VG_(snprintf)(FP_buf, BUF_LEN, format, ##args); \
+ FP_buf[BUF_LEN-1] = '\0'; /* Make sure the string is terminated. */ \
VG_(write)(fd, (void*)FP_buf, VG_(strlen)(FP_buf)); \
})
+// Same as FP, but guarantees a '\n' at the end. (At one point we were
+// truncating without adding the '\n', which caused bug #155929.)
+#define FPn(format, args...) ({ \
+ VG_(snprintf)(FP_buf, BUF_LEN, format, ##args); \
+ FP_buf[BUF_LEN-5] = '.'; /* "..." at the end make the truncation */ \
+ FP_buf[BUF_LEN-4] = '.'; /* more obvious */ \
+ FP_buf[BUF_LEN-3] = '.'; \
+ FP_buf[BUF_LEN-2] = '\n'; /* Make sure the last char is a newline. */ \
+ FP_buf[BUF_LEN-1] = '\0'; /* Make sure the string is terminated. */ \
+ VG_(write)(fd, (void*)FP_buf, VG_(strlen)(FP_buf)); \
+})
+
// Nb: uses a static buffer, each call trashes the last string returned.
static Char* make_perc(ULong x, ULong y)
{
@@ -1892,7 +1908,6 @@
Int depth_str_len,
SizeT snapshot_heap_szB, SizeT snapshot_total_szB)
{
- #define BUF_LEN 1024
Int i, n_insig_children_sxpts;
Char* perc;
Char ip_desc_array[BUF_LEN];
@@ -1925,7 +1940,10 @@
ip_desc = VG_(describe_IP)(sxpt->Sig.ip-1, ip_desc, BUF_LEN);
}
perc = make_perc(sxpt->szB, snapshot_total_szB);
- FP("%sn%d: %lu %s\n",
+ // Nb: we deliberately use 'FPn', not 'FP'. So if the ip_desc is
+ // too long (eg. due to a long C++ function name), it'll get
+ // truncated, but the '\n' is still there so its a valid file.
+ FPn("%sn%d: %lu %s\n",
depth_str, sxpt->Sig.n_children, sxpt->szB, ip_desc);
// Indent.
Modified: trunk/massif/tests/Makefile.am
===================================================================
--- trunk/massif/tests/Makefile.am 2008-01-18 07:42:01 UTC (rev 7354)
+++ trunk/massif/tests/Makefile.am 2008-01-20 22:30:52 UTC (rev 7355)
@@ -19,6 +19,7 @@
culling2.stderr.exp culling2.vgtest \
custom_alloc.post.exp custom_alloc.stderr.exp custom_alloc.vgtest
ignoring.post.exp ignoring.stderr.exp ignoring.vgtest \
+ long-names.post.exp long-names.stderr.exp long-names.vgtest \
long-time.post.exp long-time.stderr.exp long-time.vgtest \
new-cpp.post.exp new-cpp.stderr.exp new-cpp.vgtest \
no-stack-no-heap.post.exp no-stack-no-heap.stderr.exp no-stack-no-heap.vgtest \
@@ -54,6 +55,7 @@
deep \
ignoring \
insig \
+ long-names \
long-time \
new-cpp \
null \
Added: trunk/massif/tests/long-names.c
===================================================================
--- trunk/massif/tests/long-names.c (rev 0)
+++ trunk/massif/tests/long-names.c 2008-01-20 22:30:52 UTC (rev 7355)
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+// This function name is long enough to get truncated.
+
+#define A2500 \
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij
+
+void A2500(int n)
+{
+ if (n > 0) {
+ malloc(1000);
+ A2500(n-1);
+ }
+}
+
+int main(void)
+{
+ A2500(3);
+ return 0;
+}
+
Added: trunk/massif/tests/long-names.post.exp
===================================================================
--- trunk/massif/tests/long-names.post.exp (rev 0)
+++ trunk/massif/tests/long-names.post.exp 2008-01-20 22:30:52 UTC (rev 7355)
@@ -0,0 +1,51 @@
+--------------------------------------------------------------------------------
+Command: ./long-names
+Massif arguments: --stacks=no --time-unit=B --heap-admin=0 --massif-out-file=massif.out --detailed-freq=3
+ms_print arguments: massif.out
+--------------------------------------------------------------------------------
+
+
+ KB
+2.930^ :
+ | :
+ | :
+ | :
+ | :
+ | :
+ | :
+ | @ :
+ | @ :
+ | @ :
+ | @ :
+ | @ :
+ | @ :
+ | . @ :
+ | : @ :
+ | : @ :
+ | : @ :
+ | : @ :
+ | : @ :
+ | : @ :
+ 0 +----------------------------------------------------------------------->KB
+ 0 2.930
+
+Number of snapshots: 4
+ Detailed snapshots: [2]
+
+--------------------------------------------------------------------------------
+ n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B)
+--------------------------------------------------------------------------------
+ 0 0 0 0 0 0
+ 1 1,000 1,000 1,000 0 0
+ 2 2,000 2,000 2,000 0 0
+100.00% (2,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
+->100.00% (2,000B) 0x........: abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefgh
ijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefg
hijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJab...
+ ->50.00% (1,000B) 0x........: main (long-names.c:68)
+ |
+ ->50.00% (1,000B) 0x........: abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefg
hijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdef
ghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJa...
+ ->50.00% (1,000B) 0x........: main (long-names.c:68)
+
+--------------------------------------------------------------------------------
+ n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B)
+--------------------------------------------------------------------------------
+ 3 3,000 3,000 3,000 0 0
Added: trunk/massif/tests/long-names.stderr.exp
===================================================================
--- trunk/massif/tests/long-names.stderr.exp (rev 0)
+++ trunk/massif/tests/long-names.stderr.exp 2008-01-20 22:30:52 UTC (rev 7355)
@@ -0,0 +1,2 @@
+
+
Added: trunk/massif/tests/long-names.vgtest
===================================================================
--- trunk/massif/tests/long-names.vgtest (rev 0)
+++ trunk/massif/tests/long-names.vgtest 2008-01-20 22:30:52 UTC (rev 7355)
@@ -0,0 +1,4 @@
+prog: long-names
+vgopts: --stacks=no --time-unit=B --heap-admin=0 --massif-out-file=massif.out --detailed-freq=3
+post: perl ../../massif/ms_print massif.out | ../../tests/filter_addresses
+cleanup: rm massif.out
|