From: Nicholas Nethercote Date: Sun, 20 Jan 2008 23:30:30 +0000 (+0000) Subject: When truncating long lines in the output file, make sure they end with a X-Git-Tag: svn/VALGRIND_3_3_1~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0026d78f3536d07d9cca1554805ba710ce181df2;p=thirdparty%2Fvalgrind.git When truncating long lines in the output file, make sure they end with a newline. Fixes bug #155929. MERGED FROM TRUNK (r7355) git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_3_BRANCH@7356 --- diff --git a/massif/ms_main.c b/massif/ms_main.c index 6086319657..67f67e769e 100644 --- a/massif/ms_main.c +++ b/massif/ms_main.c @@ -774,6 +774,11 @@ static void sanity_check_SXTree(SXPt* sxpt) #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 void sanity_check_SXTree(SXPt* sxpt) 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,13 +1867,25 @@ IRSB* ms_instrument ( VgCallbackClosure* closure, // 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)); \ }) @@ -1892,7 +1908,6 @@ static void pp_snapshot_SXPt(Int fd, SXPt* sxpt, Int depth, Char* depth_str, 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 @@ static void pp_snapshot_SXPt(Int fd, SXPt* sxpt, Int depth, Char* depth_str, 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. diff --git a/massif/tests/Makefile.am b/massif/tests/Makefile.am index 97802683b9..fd5a01db0d 100644 --- a/massif/tests/Makefile.am +++ b/massif/tests/Makefile.am @@ -19,6 +19,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ 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 @@ check_PROGRAMS = \ deep \ ignoring \ insig \ + long-names \ long-time \ new-cpp \ null \ diff --git a/massif/tests/long-names.c b/massif/tests/long-names.c new file mode 100644 index 0000000000..260d250307 --- /dev/null +++ b/massif/tests/long-names.c @@ -0,0 +1,71 @@ +#include +#include + +// 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; +} + diff --git a/massif/tests/long-names.post.exp b/massif/tests/long-names.post.exp new file mode 100644 index 0000000000..4ed2155ca0 --- /dev/null +++ b/massif/tests/long-names.post.exp @@ -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........: 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 diff --git a/massif/tests/long-names.stderr.exp b/massif/tests/long-names.stderr.exp new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/massif/tests/long-names.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/massif/tests/long-names.vgtest b/massif/tests/long-names.vgtest new file mode 100644 index 0000000000..f071366978 --- /dev/null +++ b/massif/tests/long-names.vgtest @@ -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