newline. Fixes bug #155929.
MERGED FROM TRUNK (r7355)
git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_3_BRANCH@7356
#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
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;
// 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)); \
})
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];
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.
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 \
deep \
ignoring \
insig \
+ long-names \
long-time \
new-cpp \
null \
--- /dev/null
+#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;
+}
+
--- /dev/null
+--------------------------------------------------------------------------------
+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........: abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJab...
+ ->50.00% (1,000B) 0x........: main (long-names.c:68)
+ |
+ ->50.00% (1,000B) 0x........: abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJa...
+ ->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
--- /dev/null
+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