From 4c7fe24d03dc032ef7f0628297b56cb4991532ae Mon Sep 17 00:00:00 2001 From: Bojun Seo Date: Mon, 6 Nov 2023 12:43:35 +0900 Subject: [PATCH] stacktrace: Implement ignore If user want to ignore certain report, it could be filtered out. The filtering list can be given with the file, each line is used on filtering. Usage with samples/factorial.c compiled samples/factorial.out: $ ./heaptrace --ignore=ignore.txt samples/factorial.out [heaptrace] initialized for /proc/227960/maps (factorial.out) [heaptrace] finalized for /proc/227960/maps (factorial.out) ================================================================= [heaptrace] dump allocation sorted by 'size' for /proc/227960/maps (factorial.out) [heaptrace] heap traced num of backtrace : 9 [heaptrace] heap traced allocation size : 48 bytes [heaptrace] allocator info (virtual) : 135.168 KB [heaptrace] allocator info (resident) : 89.904 KB [heaptrace] statm info (VSS/RSS/shared) : 6.270 MB / 3.932 MB / 3.801 MB ================================================================= $ cat ignore.txt libfoo bar fac baz The original execution of samples/factorial.out is like followings $ ./heaptrace samples/factorial.out [heaptrace] initialized for /proc/227946/maps (factorial.out) [heaptrace] finalized for /proc/227946/maps (factorial.out) ================================================================= [heaptrace] dump allocation sorted by 'size' for /proc/227946/maps (factorial.out) === backtrace #1 === [count/peak: 1/1] [size/peak: 10 bytes/10 bytes] [age: 325.674 us] 0 [0x7f71089b8b6f] malloc +0x1f (./libheaptrace.so +0x4b6f) 1 [0x557ebd3191c4] fac +0xe (samples/factorial.out +0x11c4) 2 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 3 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 4 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 5 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 6 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 7 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) --- snip --- === backtrace #9 === [count/peak: 2/2] [size/peak: 1 bytes/1 bytes] [age: 330.780 us] 0 [0x7f71089b8b6f] malloc +0x1f (./libheaptrace.so +0x4b6f) 1 [0x557ebd3191a5] fac +0x7 (samples/factorial.out +0x11a5) 2 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 3 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 4 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 5 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 6 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) 7 [0x557ebd3191d8] fac +0x13 (samples/factorial.out +0x11d8) [heaptrace] heap traced num of backtrace : 9 [heaptrace] heap traced allocation size : 48 bytes [heaptrace] allocator info (virtual) : 135.168 KB [heaptrace] allocator info (resident) : 89.776 KB [heaptrace] statm info (VSS/RSS/shared) : 6.270 MB / 3.932 MB / 3.801 MB ================================================================= Signed-off-by: Bojun Seo --- src/stacktrace.cc | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/stacktrace.cc b/src/stacktrace.cc index dfeb3e0..b95aed7 100644 --- a/src/stacktrace.cc +++ b/src/stacktrace.cc @@ -314,21 +314,18 @@ print_dump_stackmap_footer(const std::vector> &sorted_stack) { const time_point_t current = std::chrono::steady_clock::now(); - int cnt = 0; + int cnt = 1; + int top = opts.top; + int i = 0; size_t stack_size = sorted_stack.size(); - for (int i = 0; i < stack_size; i++) { + while (i < stack_size && i < top) { const stack_info_t &info = sorted_stack[i].second; - - if (i >= opts.top) - break; - const stack_trace_t &stack_trace = sorted_stack[i].first; std::string age = get_delta_time_unit(current - info.birth_time); std::stringstream ss_intro; std::stringstream ss_bt; - ++cnt; ss_intro << "=== backtrace #" << cnt << " === [count/peak: " << info.count << "/" << info.peak_count << "] " << "[size/peak: " << get_byte_unit(info.total_size) << "/" @@ -337,7 +334,14 @@ static void print_dump_stackmap(std::vector> &sorted_stack) { size_t stack_size = sorted_stack.size(); - for (int i = 0; i < stack_size; i++) { + int i = 0; + int top = opts.top; + + while (i < stack_size && i < top) { const stack_info_t &info = sorted_stack[i].second; uint64_t size = info.total_size; const char *semicolon = ""; - - if (i >= opts.top) - break; - const stack_trace_t &stack_trace = sorted_stack[i].first; std::stringstream ss_bt; @@ -361,8 +364,14 @@ print_dump_stackmap_flamegraph(std::vector