diff --git a/Control/AthenaCommon/python/AthOptionsParser.py b/Control/AthenaCommon/python/AthOptionsParser.py index b994c0e7a579cc31e7f086ca9a1df4b6eec45ebf..5b998c9249e15ecbde7bbfc8568c87725ac5f639 100644 --- a/Control/AthenaCommon/python/AthOptionsParser.py +++ b/Control/AthenaCommon/python/AthOptionsParser.py @@ -26,7 +26,7 @@ _userlongopts = [ "batch", "interactive", "no-display", "debug=", "command=", "help", "loglevel=", "showincludes", "trace=", "check-properties", "version", - "leak-check=", "leak-check-execute", "delete-check=", "heapmon", + "leak-check=", "leak-check-execute", "delete-check=", "perfmon", "pmon=", "repeat-evts=", "profile-python=", "enable-ers-hdlr=", "keep-configuration","drop-configuration", "drop-and-reload", "config-only=", @@ -69,7 +69,6 @@ Accepted command line options: This disables the use of tcmalloc. --delete-check=<stage> ... perform double delete checking. This disables the use of tcmalloc. - --heapmon ... enable heap fragmentation profiling tool, HeapMon --profile-python=<file>.pkl|txt ... profile python code, dump in <file>.pkl|txt -c, --command ... one-liner, runs before any scripts -h, --help ... print this help message @@ -152,7 +151,6 @@ def parse(chk_tcmalloc=True): opts.config_dump_file = None # not used by default opts.do_leak_chk = False # default is not to do any leak checking opts.memchk_mode = '' # no mode selected by default - opts.do_heap_mon = False # default is not to do any heap monitoring opts.profile_python = None # set to file name to collect and dump python profile opts.nprocs = 0 # enable AthenaMP if >= 1 or == -1 opts.threads = 0 # enable AthenaMT if >= 1 @@ -305,9 +303,6 @@ def parse(chk_tcmalloc=True): else: print ("disabling Hephaestus leak check as it is incompatible with tcmalloc") - elif opt in ("--heapmon",): - opts.do_heap_mon = True - elif opt in ("--profile-python",): pos = arg.rfind('.') if pos < 0 or (arg[pos+1:] != "txt" and arg[pos+1:] != "pkl"): diff --git a/Control/HeapMon/CMakeLists.txt b/Control/HeapMon/CMakeLists.txt deleted file mode 100644 index 987e11ea18bcf3095285e61fc0d03c23829a77ad..0000000000000000000000000000000000000000 --- a/Control/HeapMon/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -################################################################################ -# Package: HeapMon -################################################################################ - -# Declare the package name: -atlas_subdir( HeapMon ) - -# External dependencies: -find_package( PythonLibs ) -find_package( ROOT COMPONENTS RIO Tree Core MathCore Hist pthread ) -find_package( gperftools ) - -# Component(s) in the package: -atlas_add_executable( MemoryScanner - src/MemoryScanner.cxx - INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS} ${GPERFTOOLS_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} ${PYTHON_LIBRARIES} ${GPERFTOOLS_LIBRARIES} ) - -# Install files from the package: -atlas_install_headers( HeapMon ) -atlas_install_python_modules( python/*.py ) - diff --git a/Control/HeapMon/HeapMon/HeapMon.h b/Control/HeapMon/HeapMon/HeapMon.h deleted file mode 100644 index 0687a82a800024b26bc6407a03b4423a69778837..0000000000000000000000000000000000000000 --- a/Control/HeapMon/HeapMon/HeapMon.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -#ifndef HEAPMON_HEAPMON_H -#define HEAPMON_HEAPMON_H - -#if defined(__linux__) - -#define _GNU_SOURCE 1 - -#include <stdio.h> - -#ifdef _POSIX_C_SOURCE -#undef _POSIX_C_SOURCE -#endif - -#ifdef _FILE_OFFSET_BITS -#undef _FILE_OFFSET_BITS -#endif - -#endif - -#include "Python.h" - -/* control parameters for static data blocks */ - -/* maximum available number of check points */ -#define mm_MAX_CHECKPOINTS 10 - -/* start size of hash tables for data */ -#define mm_HASHTABLE_MINSIZE 4096 - -/* maximum total depth of tracebacks kept in memory */ -#define mm_TRACEDEPTH 12 -/* system offset: 0 == helper, 1 == hook, 2 == malloc/realloc */ -#define mm_SYSTEMOFF 3 -/* total backtrace size left: mm_TRACEDEPTH - mm_SYSTEMOFF */ -#define mm_BACKTRACE_SIZE mm_TRACEDEPTH - mm_SYSTEMOFF - -/* max size for symbols, files, and other buffers */ -#define mm_SYMBOL_BUFLEN 2048 - -#endif /* !HEAPMON_HEAPMON_H */ diff --git a/Control/HeapMon/python/EventNotifier.py b/Control/HeapMon/python/EventNotifier.py deleted file mode 100644 index 53efc4fa3491bb64b432c4bbcd798157492989f4..0000000000000000000000000000000000000000 --- a/Control/HeapMon/python/EventNotifier.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration - -import AthenaPython.PyAthena as PyAthena -import sys, os - -from ROOT import TTree, TFile -from array import array - - -#from HeapMon import MemoryScanner as memscanner -#from HeapMon import MemoryMarker as memmarker -#from Hephaestus import MemoryTracker as memtracker - - -class EventExecutionNotifier( PyAthena.Alg ): - event_number = 0 - max_events = 0 - stop_scan = 1 - start_scan = 0 - report_scan_number = 0 - file_name = "heapmon.freed.root" - marker = 0xCD - - memmarker = 'HeapMon.MemoryMarker' in sys.modules and sys.modules[ 'HeapMon.MemoryMarker' ] or None - memscanner = 'HeapMon.MemoryScanner' in sys.modules and sys.modules[ 'HeapMon.MemoryScanner' ] or None - memtracker = 'Hephaestus.MemoryTracker' in sys.modules and sys.modules[ 'Hephaestus.MemoryTracker' ] or None - - #memtracker = 'Hephaestus.MemoryTracker' in sys.modules and \ - # sys.modules['Hephaestus.MemoryTracker' ] or None - - def __init__(self, name="EventExecutionNotifier"): - ## init the base class - super(EventExecutionNotifier,self).__init__() - return - - def initialize( self ): - # INITIALIZATION MARKING - print 'Notifier.initialize():' - #memmarker = 'HeapMon.MemoryMarker' in sys.modules and \ - #sys.modules[ 'HeapMon.MemoryMarker' ] or None - #if memmarker: - # memmarker.start() - - self.event_number = 0 - - print " file_name = ", self.file_name - print " self.max_events = ", self.max_events - print " report_scan_number = ", self.report_scan_number - if self.memtracker: - print(' starting memtracker - MemoryTracker ') - self.memtracker.start() - else: - print(' memtracker - MemoryTracker not loaded!') - - if self.memscanner: - #print' memscanner.memscan()' - self.memscanner.memscan(self.file_name, 2, self.event_number, self.marker); #SCAN_FLAG = 2: no holes statistics saved, just info - else: - print(' memscanner is not loaded!') - - # Extract MallocInfo and put into root file - self.mallinfo() - return PyAthena.StatusCode.Success - - def execute( self ): - print "Notifier.execute()" - self.event_number +=1 - print "Notifier.event_number = ", self.event_number - - if self.memscanner: - print ' memscanner.memscan()' - if (self.start_scan == 0): - self.memscanner.memscan(self.file_name, 2, self.event_number, self.marker); #SCAN_FLAG = 1: holes statistics saved - elif (self.start_scan == -1): - self.memscanner.memscan(self.file_name, 1, self.event_number, self.marker); #SCAN_FLAG = 2: no holes statistics saved, just info - elif ((self.event_number >= self.start_scan) - and (self.event_number <= self.stop_scan)): - self.memscanner.memscan(self.file_name, 1, self.event_number, self.marker); #SCAN_FLAG = 2: no holes statistics saved, just info - else: - self.memscanner.memscan(self.file_name, 2, self.event_number, self.marker); #SCAN_FLAG = 1: holes statistics saved - else: - print(' memscanner is not loaded!') - - - self.mallinfo() - - if self.memtracker: - if self.event_number <= self.stop_scan: - print ('MemoryTracker is marking the memory') - else: - print("MemoryTracker configure() to stop the marking"); - print ("MemoryTracker.gFlags = ", - self.memtracker.configure( - self.memtracker.LEAK_CHECK | - self.memtracker.QUICK )#| MemoryTracker.FILTER_STL) - ) - elif self.memmarker: - if (self.start_scan == 0): - print('EventNotifier.execute(): marker idling') - elif self.event_number <= self.stop_scan: - print 'EventNotifier.execute(): memmarker.start(), event_number=', self.event_number - self.memmarker.start() - else: - print('Notifier.execute(): MemoryMarker.stop() , event_number=', self.event_number) - self.memmarker.stop() - else: - print('Notifier.execute(): memmarker and memtracker are not loaded!') - - return PyAthena.StatusCode.Success - - def finalize( self ): - self.msg.info( 'finalizing [%s]', self.name() ) - if self.memmarker: - self.memmarker.stop() - if self.memtracker: - self.memtracker.stop() - if self.memscanner: - from HeapMon import HeapMonReport as memreport - memreport.report() - return PyAthena.StatusCode.Success - - - def mallinfo(self): - if self.memmarker: - print('Notifier.mallinfo(): malloc info') - (malloc_sbrk, malloc_mmap, malloc_inuse, malloc_free) = self.memmarker.get_malloc_info() - sbrk = array('I', [0]); sbrk[0] = malloc_sbrk; - mmap = array('I', [0]); mmap[0] = malloc_mmap; - inuse = array('I', [0]); inuse[0] = malloc_inuse; - free = array('I', [0]); free[0] = malloc_free; - print 'sbrk=', sbrk, ' mmap=', mmap, ' inuse=', inuse, 'free', free - scan_number = array('L', [0]); scan_number[0] = self.event_number; - memFile = TFile(self.file_name, "update") - mallocTree = memFile.Get("mallocTree"); - mallocTree.SetBranchAddress("malloc_sbrk", sbrk); - mallocTree.SetBranchAddress("malloc_mmap", mmap); - mallocTree.SetBranchAddress("malloc_inuse",inuse); - mallocTree.SetBranchAddress("malloc_free", free); - mallocTree.SetBranchAddress("scan_number", scan_number); - mallocTree.Fill() - mallocTree.Write() - mallocTree.Delete - memFile.Write() - memFile.Close() - self.memmarker.show_info() - else: - print('Notifier.mallinfo(): memmarker is not loaded!') diff --git a/Control/HeapMon/python/HeapMonReport.py b/Control/HeapMon/python/HeapMonReport.py deleted file mode 100644 index af1af67d2a50ec6a65ec8cdb24eb1354397f0bc5..0000000000000000000000000000000000000000 --- a/Control/HeapMon/python/HeapMonReport.py +++ /dev/null @@ -1,309 +0,0 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration - -import AthenaPython.PyAthena as PyAthena -import sys, os -import math, time , array - -from ROOT import gROOT, gDirectory, gStyle, gPad -from ROOT import TFile -from ROOT import TH1I, TH2I, TF1 -from ROOT import TH1F, TH2F, TGraph, TMultiGraph -from ROOT import TCanvas, TPad, TPaveLabel, TPaveText, TLegend - -#from ROOT import TCanvas # available at startup -root_file = 'mems.root' -freed_file = 'heapmon.freed.root' - -hole_trace_start = 0 - -def iReport(file): - global root_file - root_file = file - report() - -def pReport(): - global root_file - memscanner = 'HeapMon.MemoryScanner' in sys.modules and \ - sys.modules[ 'HeapMon.MemoryScanner' ] or None - if memscanner: - holes_file = memscanner.freescan_output - #root_file = file - report() - -def findStaticHoles(): - global freed_file - global hole_trace_start - tfile = TFile(freed_file, "READ") - - #mychain = gDirectory.Get( 'memTree' ) - tree = tfile.Get("holeTree") - entry_number = tree.GetEntries() - print("There are ", entry_number , " entries in ", root_file) - previous_scan_number = -1; - - holes_dict = dict() - previous_holes_dict = dict() - - for i in xrange(entry_number): - tree.GetEntry(i) - if tree.scan_number < hole_trace_start: - continue - if previous_scan_number == tree.scan_number: - #print "add new hole ", tree.hole_start, "size ", tree.hole_size - holes_dict[tree.hole_start] = tree.hole_size; - else: - previous_scan_number = tree.scan_number - if previous_holes_dict: - print "looking for intersection with next scan dict" - intersection = dict([(item,holes_dict[item]) for item in holes_dict.keys() if previous_holes_dict.has_key(item)]) - previous_holes_dict = intersection - print len(intersection), " elements in intersection" - #print "intersection=", intersection - else: - previous_holes_dict = holes_dict - - holes_dict.clear() - - intersection = dict([(item,holes_dict[item]) for item in holes_dict.keys() if previous_holes_dict.has_key(item)]) - - print "intersection=", intersection - print len(intersection), " static holes identified" - - import cPickle - pickle_file = "mems.dat" - file = open(pickle_file, 'w') - cPickle.dump(intersection, file) - file.close() - del file - - -def report(): - global freed_file - print' HeapMonReport.report(): heapmon_file=', freed_file - - #findStaticHoles() - - tfile = TFile(freed_file, "READ") - print " root compression factor = ", tfile.GetCompressionFactor() - - mem_canvas = TCanvas("HeapMon_report", "Memory Holes Statistics", 10, 10, 800, 1034); - mem_canvas.SetFillColor(17); - mem_canvas.cd() - - pad1 = TPad("pad1","pad1",0.01,0.57,0.50,0.93,33); - pad2 = TPad("pad2","pad2",0.51,0.57,0.99,0.93,33); - pad3 = TPad("pad3","pad3",0.01,0.01,0.99,0.50,33); - pad3.SetPhi(210); - pad3.SetTheta(25); - - pad1.Draw(); pad2.Draw(); pad3.Draw(); - memTree = tfile.Get("holeTree") - infoTree = tfile.Get("infoTree") - mallocTree = tfile.Get("mallocTree") - #holesm_th1i = TH1I('holesm_th1i', 'Holes size evolution', fcount, 0, fcount) - #holesn_th1i = TH1I('holesn_th1i', 'Holes number evolution', fcount, 0, fcount) - #total_th1i = TH1I('total_th1i', 'Total memory size evolution', fcount, 0, fcount) - - max_hole_size = memTree.GetMaximum("hole_size") - print " max_hole_size=", max_hole_size, " min_hole_size", memTree.GetMinimum("hole_size") - max_scan_number = memTree.GetMaximum("scan_number") - print " max_scan_number=", max_scan_number - - memHist1 = TH2I("mem2d","Hole-sizes distribution evolution", 128, -0.5, max_hole_size - 0.5, 50, 0, max_scan_number) - memTree.Project("mem2d", "scan_number:hole_size"); - - multiGraph1 = TMultiGraph(); - multiGraph2 = TMultiGraph(); - - print " memHist.GetMaximum() = ", memHist1.GetMaximum(); - - # Working on a Report - gStyle.SetOptStat(0); - gStyle.SetPalette(1); - gStyle.SetCanvasColor(33); - gStyle.SetFrameFillColor(18); - - memHist1.SetFillColor(30); - memHist1.SetFillStyle(0); - memHist1.GetXaxis().SetTitle("Size of holes, kb"); - memHist1.GetXaxis().SetLabelOffset(0.02); - memHist1.GetXaxis().SetLabelSize(0.02); - memHist1.GetXaxis().SetTitleSize(0.04); - memHist1.GetXaxis().SetTitleColor(2); - memHist1.GetYaxis().SetTitle("Event number"); - memHist1.GetYaxis().SetLabelSize(0.04); - memHist1.GetXaxis().SetLabelOffset(0.04); - memHist1.GetYaxis().SetTitleSize(0.04); - memHist1.GetYaxis().SetTitleColor(2); - memHist1.GetZaxis().SetTitle("Number of holes"); - memHist1.GetZaxis().SetLabelSize(0.02); - memHist1.GetZaxis().SetTitleSize(0.04); - memHist1.GetZaxis().SetTitleColor(2); - - title = TPaveLabel(0.1,0.95,0.9,0.99, "Job Memory Usage Plots"); - title.SetFillColor(42); - title.SetTextFont(42); - title.Draw(); - - text_box = TPaveText(0.1,0.51,0.9,0.54); - text_box.AddText("Malloc freed ('marked') Heap Memory Profile"); - text_box.SetFillColor(42); - text_box.SetTextAlign(12); - text_box.SetTextFont(42); - text_box.Draw(); - - x1=0.2; y1=0.91; x2=0.8; y2=0.98; - -#Drawing upper-left corner Pad1 of the report - pad1.cd(); - pad1.SetGridx();pad1.SetGridy(); - infoTree.Draw("total_maps_memory:scan_number","", "goff") - mapsGraph=TGraph(int(infoTree.GetSelectedRows()), infoTree.GetV2(), infoTree.GetV1()); - mapsGraph.SetLineColor(1); mapsGraph.SetLineWidth(1); #mapsGraph.SetFillStyle(3001); mapsGraph.SetFillColor(2); - mapsGraph.SetName("total_maps_memory"); - #VmSize, VmLck, VmRSS, VmData, VmStk, VmExe, VmLib; - infoTree.Draw("VmSize:scan_number", "","goff"); - vmsizeGraph=TGraph(int(infoTree.GetSelectedRows()), infoTree.GetV2(), infoTree.GetV1()); - vmsizeGraph.SetLineColor(2); vmsizeGraph.SetLineWidth(1); #vmsizeGraph.SetFillStyle(3002); vmsizeGraph.SetFillColor(3); - vmsizeGraph.SetName("VmSize"); - - infoTree.Draw("VmRSS:scan_number", "", "goff"); - vmrssGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()); - vmrssGraph.SetLineColor(3); vmrssGraph.SetLineWidth(1); #vmrssGraph.SetFillStyle(3003); vmrssGraph.SetFillColor(4); - vmrssGraph.SetName("VmRSS"); - - infoTree.Draw("VmData:scan_number", "", "goff"); - vmdataGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()); - vmdataGraph.SetLineColor(4); vmdataGraph.SetLineWidth(1); #vmdataGraph.SetFillStyle(3004); vmdataGraph.SetFillColor(4); - vmdataGraph.SetName("VmData"); - - infoTree.Draw("VmStk:scan_number", "", "goff"); - vmstkGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()); - vmstkGraph.SetLineColor(5); vmstkGraph.SetLineWidth(1); #vmstkGraph.SetFillStyle(3005); vmstkGraph.SetFillColor(4); - vmstkGraph.SetName("VmStk") - - infoTree.Draw("VmExe:scan_number", "", "goff"); - vmexeGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()); - vmexeGraph.SetLineColor(6); vmexeGraph.SetLineWidth(1); #vmexeGraph.SetFillStyle(3003); vmexeGraph.SetFillColor(4); - vmexeGraph.SetName("VmExe"); - - infoTree.Draw("VmLib:scan_number", "", "goff"); - vmlibGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()); - vmlibGraph.SetLineColor(7); vmlibGraph.SetLineWidth(1); #vmlibGraph.SetFillStyle(3003); vmlibGraph.SetFillColor(4); - vmlibGraph.SetName("VmLib"); - - infoTree.Draw("VmLck:scan_number", "", "goff"); - vmlckGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()); - vmlckGraph.SetLineColor(8); vmlckGraph.SetLineWidth(1); #vmlckGraph.SetFillStyle(3003); vmlckGraph.SetFillColor(4); - vmlckGraph.SetName("VmLck"); - - infoTree.Draw("total_hole_memory:scan_number", "", "goff"); - holeGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()) - holeGraph.SetLineColor(9); holeGraph.SetLineWidth(1); #holeGraph.SetFillStyle(3004); holeGraph.SetFillColor(5); - holeGraph.SetName("HolesSize"); - - mallocTree.Draw("malloc_free:scan_number", "", "goff"); - freeGraph=TGraph(mallocTree.GetSelectedRows(), mallocTree.GetV2(), mallocTree.GetV1()) - freeGraph.SetLineColor(11); freeGraph.SetLineWidth(1); freeGraph.SetFillStyle(3003); freeGraph.SetFillColor(4); - freeGraph.SetName("malloc_free"); - - mallocTree.Draw("malloc_inuse:scan_number", "", "goff"); - inuseGraph=TGraph(mallocTree.GetSelectedRows(), mallocTree.GetV2(), mallocTree.GetV1()) - inuseGraph.SetLineColor(21); inuseGraph.SetLineWidth(1); inuseGraph.SetFillStyle(3003); inuseGraph.SetFillColor(4); - inuseGraph.SetName("malloc_inuse"); - - mallocTree.Draw("malloc_sbrk:scan_number", "", "goff"); - sbrkGraph=TGraph(mallocTree.GetSelectedRows(), mallocTree.GetV2(), mallocTree.GetV1()) - sbrkGraph.SetLineColor(31); sbrkGraph.SetLineWidth(1); sbrkGraph.SetFillStyle(3003); sbrkGraph.SetFillColor(4); - sbrkGraph.SetName("malloc_sbrk"); - - mallocTree.Draw("malloc_mmap:scan_number", "", "goff"); - mmapGraph=TGraph(mallocTree.GetSelectedRows(), mallocTree.GetV2(), mallocTree.GetV1()) - mmapGraph.SetLineColor(41); mmapGraph.SetLineWidth(1); mmapGraph.SetFillStyle(3003); mmapGraph.SetFillColor(4); - mmapGraph.SetName("malloc_mmap"); - - pad1.cd(); - multiGraph1.Add(mapsGraph);multiGraph1.Add(vmsizeGraph); - multiGraph1.Add(vmrssGraph);multiGraph1.Add(vmdataGraph); - multiGraph1.Add(vmlckGraph);multiGraph1.Add(vmexeGraph); - multiGraph1.Add(vmstkGraph);#multiGraph1.Add(vmlibGraph); - multiGraph1.Add(inuseGraph); - multiGraph1.Add(sbrkGraph);multiGraph1.Add(mmapGraph); - multiGraph1.Add(holeGraph);multiGraph1.Add(freeGraph); - - - - #multiGraph1.SetTitle("PROCESS VM and Malloc MEMORY USAGE"); - title.DrawPaveLabel(x1,y1,x2,y2,"PROCESS VM and Malloc MEMORY USAGE","brNDC"); - - multiGraph1.Draw("ALg") - hist = multiGraph1.GetHistogram(); hist.SetXTitle("Event Number"); hist.SetYTitle("Memory, kb"); - legend1 = TLegend(0.84,0.20,0.99,0.90); - legend1.AddEntry(mapsGraph, "Maps", "l"); - legend1.AddEntry(vmsizeGraph,"VmSize", "l"); - legend1.AddEntry(vmrssGraph, "VmRSS", "l"); - legend1.AddEntry(vmdataGraph,"VmData", "l"); - - legend1.AddEntry(sbrkGraph, "MallocSbrk", "l"); - legend1.AddEntry(inuseGraph, "MallocInuse", "l"); - #legend1.AddEntry(vmlibGraph, "VmLib", "l"); - legend1.AddEntry(mmapGraph, "MallocMmap", "l"); - legend1.AddEntry(freeGraph, "MallocFree", "l"); - legend1.AddEntry(holeGraph, "Freed-Holes", "l"); - legend1.AddEntry(vmstkGraph, "VmStk", "l"); - legend1.AddEntry(vmexeGraph, "VmExe", "l"); - legend1.AddEntry(vmlckGraph, "VmLck", "l"); - legend1.Draw(); - - #multiGraph1.Draw("ALg") - #title.DrawPaveLabel(x1,y1,x2,y2,"Process Memory Usage Charts","brNDC"); - - -#Drawing upper-left corner Pad1 of the report - pad2.cd(); - pad2.SetGridx(); pad2.SetGridy(); - - infoTree.Draw("total_hole_memory:scan_number", "", "goff"); - holeGraph=TGraph(infoTree.GetSelectedRows(), infoTree.GetV2(), infoTree.GetV1()) - holeGraph.SetLineColor(9); holeGraph.SetLineWidth(1); holeGraph.SetFillStyle(3004); holeGraph.SetFillColor(5); - holeGraph.SetName("total_hole_memory"); - - mallocTree.Draw("malloc_free:scan_number", "", "goff"); - freeGraph=TGraph(mallocTree.GetSelectedRows(), mallocTree.GetV2(), mallocTree.GetV1()) - freeGraph.SetLineColor(11); freeGraph.SetLineWidth(1); freeGraph.SetFillStyle(3004); freeGraph.SetFillColor(5); - freeGraph.SetName("malloc_free"); - - pad2.cd(); - multiGraph2.Add(holeGraph); - multiGraph2.Add(freeGraph); - #multiGraph2.Add(sbrkGraph); - #multiGraph2.Add(mmapGraph); - - #multiGraph2.SetTitle("Free and Marked Holes Memory Graph"); - title.DrawPaveLabel(x1,y1,x2,y2,"Malloc Free and Marked Holes Memory","brNDC"); - - multiGraph2.Draw("ALg") - hist = multiGraph2.GetHistogram(); hist.SetXTitle("Event Number"); hist.SetYTitle("Memory, kb"); - - legend2 = TLegend(0.9,0.30,0.99,0.90); - legend2.AddEntry(freeGraph, "Free", "l"); - legend2.AddEntry(holeGraph, "Holes", "l"); - #legend2.AddEntry(inuseGraph, "Inuse", "l"); - #legend2.AddEntry(mmapGraph, "Mmap", "l"); - #legend2.AddEntry(sbrkGraph, "Sbrk", "l"); - - legend2.Draw() - #multiGraph2.Draw("ALg") - #title.DrawPaveLabel(x1,y1,x2,y2,"Malloc Memory Usage and Deallocation Charts","brNDC"); - - #PAD3 - pad3.cd() - pad3.SetLogz() - memHist1.Draw("lego2"); - #title.DrawPaveLabel(x1,y1,x2,y2,"TH2I-LEGO2","brNDC"); - - mem_canvas.SetBorderSize(1); - #mem_canvas.Modified() - mem_canvas.Update() - mem_canvas.Print(".pdf") - mem_canvas.Print(".C") \ No newline at end of file diff --git a/Control/HeapMon/python/MemoryScanner.py b/Control/HeapMon/python/MemoryScanner.py deleted file mode 100644 index b565c1a40e049b0c88a488fd693c8529c27ee217..0000000000000000000000000000000000000000 --- a/Control/HeapMon/python/MemoryScanner.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration - -import os, sys; - -memscan_output = 'heapmon.holes.root' -freescan_output = 'heapmon.freed.root' -newscan_output = 'heapmon.newed.root' - -pid = os.getpid(); -free_marker = 0xCD; -new_marker = 0xBC; -scan_number = 0; -scan_flag = 1; -free_scan_number = 0; -new_scan_number = 0; - -memmarker = 'HeapMon.MemoryMarker' in sys.modules and \ -sys.modules[ 'HeapMon.MemoryMarker' ] or None - -#meminfo_file_name = 'mem' -#print(' RunScanner is loaded: file name for memscan=', memscan_output) - -def nmemscan(file_name, scan_flag, n, id, mrkr = 0xCD): - global pid; - - try: - os.kill(id, 0) - except OSError, err: - print("pid ", id , " doesn't exist, so pid stays os.getpid()=", pid) - id = pid; - - print(' output_file ', file_name) - print ' scan_flag = ', scan_flag - print ' scan_number = ', n - - print('MemoryScanner.exe %d %d %d %s %d %s' %(id, scan_flag, n, file_name, mrkr) ); - os.system( 'MemoryScanner.exe %d %d %d %s %d %s' %(id, scan_flag, n, file_name, mrkr) ); - -def imemscan(): - global pid, free_marker, scan_number, scan_flag, memscan_output - print('MemoryScanner.exe %d %d %d %s %d' %(pid, scan_flag, scan_number, memscan_output, free_marker) ); - os.system( 'MemoryScanner.exe %d %d %d %s %d' %(pid, scan_flag, scan_number, memscan_output, free_marker) ); - scan_number+=1 - -def memscan(file_name, scan_f, scan_n, marker): - global pid - print('MemoryScanner.exe %d %d %d %s %d' %(pid, scan_f, scan_n, file_name, marker) ); - os.system( 'MemoryScanner.exe %d %d %d %s %d' %(pid, scan_f, scan_n, file_name, marker) ); - -def freescan(scan_flag): - global free_scan_number, free_marker - global freescan_output - print ('MemoryScanner.freescan(', scan_flag, ')') - print ' scan_flag = ', scan_flag - print ' scan_number = ', free_scan_number - #print ' RunScanner.memstat()' - print('MemoryScanner.exe %d %d %d %s %d' %(pid, scan_flag, free_scan_number, freescan_output, free_marker) ); - os.system( 'MemoryScanner.exe %d %d %d %s %d' %(pid, scan_flag, free_scan_number, freescan_output, free_marker) ); - - free_scan_number+=1 - -def newscan(scan_flag): - global new_scan_number, new_marker - global newscan_output - print ('MemoryScanner.newscan(', scan_flag, ')') - print ' scan_flag = ', scan_flag - print ' scan_number = ', new_scan_number - #print ' RunScanner.memstat()' - print('MemoryScanner.exe %d %d %d %s %d' %(pid, scan_flag, new_scan_number, newscan_output, new_marker) ); - os.system( 'MemoryScanner.exe %d %d %d %s %d' %(pid, scan_flag, new_scan_number, newscan_output, new_marker) ); - new_scan_number+=1 - diff --git a/Control/HeapMon/python/__init__.py b/Control/HeapMon/python/__init__.py deleted file mode 100644 index a63ba62d7570caa7d1b86745aa4f5486b839063d..0000000000000000000000000000000000000000 --- a/Control/HeapMon/python/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration - -# File: HeapMon/__init__.py -# Author: Mous Tatarkhanov (MMTatarkhanov@lbl.gov) - -__version__ = '0.0.1' -__author__ = 'Mous Tatarkhanov (tmmous@berkeley.edu)' - -def setup(): - import atexit, os - __path__.append( os.path.join( __path__[0], os.environ[ 'CMTCONFIG' ] ) ) - - from HeapMon import MemoryMarker - MemoryMarker.configure( MemoryMarker.IS_RUNNING ) - - atexit.register( MemoryMarker.atexit ) - -setup() -del setup diff --git a/Control/HeapMon/share/heapmon_jobo.py b/Control/HeapMon/share/heapmon_jobo.py deleted file mode 100755 index 2f9081076d8a87523c26adca24a341ca891003e8..0000000000000000000000000000000000000000 --- a/Control/HeapMon/share/heapmon_jobo.py +++ /dev/null @@ -1,28 +0,0 @@ -OutputLevel=INFO -doCBNT=False -EvtMax = 5 - -from AthenaCommon.AlgSequence import AlgSequence -job = AlgSequence() -assert( job == AlgSequence() ) # this is a singleton - -from HeapMon.EventNotifier import EventExecutionNotifier -een =EventExecutionNotifier('EventNotifier') -een.start_scan = 1 -een.stop_scan = 4 - -job.insert(0,een) - -#DetDescrVersion="ATLAS-GEO-02-01-00" -#PoolRDOInput = [ "RDO.pool.root" ] - -# DetFlags modifications are best set here (uncomment RecExCommon_flags first) -#include ("RecExCond/RecExCommon_flags.py") -# switch off ID, calo, or muons -#DetFlags.ID_setOff() -#DetFlags.Calo_setOff() -#DetFlags.Muon_setOff() -print job - -include ("jobOptions.py") -####################################################### diff --git a/Control/HeapMon/src/MemoryMarker.c b/Control/HeapMon/src/MemoryMarker.c deleted file mode 100644 index cb3f420e6673f8aadab0c1b5c9cdef62d572f67b..0000000000000000000000000000000000000000 --- a/Control/HeapMon/src/MemoryMarker.c +++ /dev/null @@ -1,877 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -//#ifndef HEAPMON_HEAPMON_H -//#define HEAPMON_HEAPMON_H -#if defined(__linux__) - -#define _GNU_SOURCE 1 - -#include <stdio.h> - -#ifdef _POSIX_C_SOURCE -#undef _POSIX_C_SOURCE -#endif - -#ifdef _XOPEN_SOURCE -#undef _XOPEN_SOURCE -#endif - -#ifdef _FILE_OFFSET_BITS -#undef _FILE_OFFSET_BITS -#endif - -#include "Python.h" - -#include <execinfo.h> -#include <malloc.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <assert.h> - -#include <gperftools/malloc_hook_c.h> - -//#include <google/malloc_extension_c.h> -void MallocExtension_GetStats(char*, int); -size_t MallocExtension_GetAllocatedSize(void*); -int mm_check(int); -int mm_clearCheckPoint(int); -int mm_depth(int); -int mm_setCheckPoint(void); -void get_trace(long); -void get_key_list(void); -void trace(const char*); - - -// copied from malloc.c -/* -------------- Early definitions for debugging hooks ---------------- */ -/* Define and initialize the hook variables. These weak definitions must - appear before any use of the variables in a function (arena.c uses one). */ -#ifndef weak_variable -#ifndef _LIBC -#define weak_variable /**/ -#else -/* In GNU libc we want the hook variables to be weak definitions to - avoid a problem with Emacs. */ -#define weak_variable weak_function -#endif -#endif - - -/*- data ------------------------------------------------------------------- */ - -/* holder to locate this shared library */ -void mm_dummy() {} - -// defined below -static void tc_MallocHook(const void* ptr, size_t size); -static void tc_FreeHook(const void* ptr); - -static MallocHook_NewHook old_tcMalloc_hook_ = NULL ; -static MallocHook_DeleteHook old_tcFree_hook_ = NULL; - -/* forward declarations */ -static void mm_Hooks_uninstall(); -static void *mm_MallocHook( size_t size, const void *caller ); -static void *mm_ReallocHook( void *ptr, size_t size, const void *caller ); -static void mm_FreeHook( void *ptr, const void *caller ); - -/* holders for original hooks */ -static void *(*m_OldMallocHook) ( size_t size, const void *caller ); -static void *(*m_OldReallocHook) ( void *ptr, size_t size, const void *caller ); -static void (*m_OldFreeHook) ( void *ptr, const void *caller ); - -/* available flags */ -#define IS_RUNNING 1 -#define LEAK_CHECK 2 -#define PROFILE 4 -#define HIDEMEMADDR 8 -#define QUICK 16 -#define STL_CHECKS 32 -#define FILTER_STL 64 -#define IS_MARKING 128 - -#define SIZE_MARK '\xFB' - -static unsigned char FREE_MARKER = '\xCD'; -static unsigned char NEW_MARKER = '\xBC'; -//static short int MAX_EVENT_NUMBER = 10; - -static unsigned char USETCMALLOC = 1; - -/* module-level configuration flags */ -static long gFlags = 0; -static size_t LOWER_THREE_BITS = (0x01|0x02|0x04); -static long event_counter = 0; - -static unsigned long long total_freed = 0; -static unsigned long long total_allocated = 0; -static unsigned long long number_freed = 0; -static unsigned long long number_allocated = 0; -static unsigned long long number_zero_allocated = 0; -static unsigned long long number_zeroptr_freed = 0; -static struct mallinfo mem_struct; - -/* handle to output stream used */ -static FILE *file_output = 0; - -void * old_ptr; -static char buffer[512]; - - - -/* _________________________________________________________________________ */ -static void mm_report( void ) { - printf(" MemoryMarker->mm_report(): gFlags = %ld\n", gFlags); -} - - -/* _________________________________________________________________________ */ -static void ignore( const char *name ) { - gFlags = gFlags & ~IS_MARKING; - printf(" MemoryMarker->ignore(): IS_MARKING flag dropped. gFlags = %ld\n", gFlags); -} - - -/* _________________________________________________________________________ */ -static void mm_Hooks_save() { - switch(USETCMALLOC){ - case 0: - /* store old glibc hooks in buffer for reset later; prevent storing ourselves in - case of a double-call by the user (e.g. from python) */ - //printf(" MemoryMarker->mm_Hooks_save ptmalloc gFlags = %u\n", gFlags); - - /*if ( __malloc_hook != mm_MallocHook ) - m_OldMallocHook = __malloc_hook; - if ( __realloc_hook != mm_ReallocHook ) - m_OldReallocHook = __realloc_hook; */ - if ( __free_hook != mm_FreeHook ) - m_OldFreeHook = __free_hook; - break; - case 1: - printf(" MemoryMarker->mm_Hooks_save tcmalloc gFlags = %ld\n", gFlags); - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } -} - -/* _________________________________________________________________________ */ -static long configure( long flags ) { - gFlags |= IS_RUNNING; - gFlags |= flags; - - printf(" MemoryMarker->configure(): IS_RUNNING flag raised. gFlags = %ld\n", gFlags); - - //setup(); - switch(USETCMALLOC){ - case 0: - mm_Hooks_save(); - break; - case 1: - printf(" MemoryMarker->configure() tcmalloc gFlags = %ld\n", gFlags); - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } - return gFlags; -} - -static void set_marker(char m) { - FREE_MARKER = m; -} - -static void get_test(long lkey) { - - struct mallinfo mem_struct; - - switch(USETCMALLOC){ - case 0: - printf("MemoryMarker->get_test()->Malloc Stats:\n"); - printf("--------------------------MALLOC INFO --------------\n"); - malloc_stats(); - - mem_struct = mallinfo(); - printf(" sbrk-Allocated Memory( ARENA) size: %u\n", mem_struct.arena); - printf(" MMAP-Allocated Memory: %u\n", mem_struct.hblkhd); - printf(" Number of chunks allocated by MMAP: %u\n", mem_struct.hblks); - printf(" MALLOC-In Use: %u\n", mem_struct.uordblks ); - printf(" MALLOC-Free: %u\n", mem_struct.fordblks); - printf(" Number of chunks from OS not in use by MALLOC: %u\n", mem_struct.ordblks); - printf(" Top-releasable chunk keepcost: %u\n", mem_struct.keepcost); - - printf("-----------------------------------------------------\n\n"); - - /* - printf(" gnu_libc_version= %s\n",gnu_get_libc_version()); - printf("------------------Sizes and Ranges of Integer Types-------------------\n"); - printf(" NUMBER OF BITS in types: \n"); - - printf(" CHAR_BIT=%u, SHRT_BIT=%u, INT_BIT=%u, LONG_BIT=%u, LONG_LONG_BIT=%u\n", - CHAR_BIT, sizeof(signed short int)*CHAR_BIT,sizeof(signed int)*CHAR_BIT, - sizeof(signed long int)*CHAR_BIT, sizeof(signed long long int)*CHAR_BIT); - printf(" \n"); - printf(" sizeof(size_t)=%u\t\tsizeof(ptrdiff_t)=%u\n",sizeof(size_t), sizeof(ptrdiff_t)); - printf(" TYPE RANGES:\n"); - printf(" CHAR_MIN=%d\t\tCHAR_MAX=%d\t\tUCHAR_MAX=%u\n", CHAR_MIN, CHAR_MAX, UCHAR_MAX); - printf(" SHRT_MIN=%d\t\tSHRT_MAX=%d\t\tUINT_MAX=%u\n", SHRT_MIN, SHRT_MAX, USHRT_MAX); - printf(" INT_MIN=%d\t\tINT_MAX=%d\t\tUINT_MAX=%u\n", INT_MIN, INT_MAX, UINT_MAX); - printf(" LONG_MIN=%e\t\tLONG_MAX=%e\tULONG_MAX=%e\n", LONG_MIN*1.0, LONG_MAX*1.0,ULONG_MAX*1.0 ); - printf(" LONG_LONG_MIN=%e\tLONG_LONG_MAX=%e\tULONG_LONG_MAX=%e\n", LONG_LONG_MIN*1.0, LONG_LONG_MAX*1.0, ULONG_LONG_MAX*1.0); - printf("----------------------------------------------------------------------\n"); - */ - break; - case 1: - mem_struct = mallinfo(); - printf(" MemoryMarker->get_test tcmalloc gFlags = %ld\n", gFlags); - printf(" sbrk-Allocated Memory( ARENA) size: %u\n", mem_struct.arena); - //printf(" MMAP-Allocated Memory: %u\n", mem_struct.hblkhd); - //printf(" Number of chunks allocated by MMAP: %u\n", mem_struct.hblks); - printf(" MALLOC-In Use: %u\n", mem_struct.uordblks ); - printf(" MALLOC-Free: %u\n", mem_struct.fordblks); - //printf(" Number of chunks from OS not in use by MALLOC: %u\n", mem_struct.ordblks); - //printf(" Top-releasable chunk keepcost: %u\n", mem_struct.keepcost); - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } - -} - -static void store_malloc_info() { - //printf("MemoryMarker->store_malloc_info() store malloc data into file:\n"); - malloc_stats(); -} - -static void show_malloc_info() { - - switch(USETCMALLOC){ - case 0: - printf("\n--------- GLIBC ptmalloc( --stdcmalloc) INFO --------\n"); - malloc_stats(); - mem_struct = mallinfo(); - printf(" SBRK-allocated memory( ARENA) size: %u bytes\n", mem_struct.arena); - printf(" MMAP-allocated memory: %u bytes\n", mem_struct.hblkhd); - printf(" MMAP-allocated number of chunks: %u\n", mem_struct.hblks); - printf(" MALLOC-In-use: %u bytes \n", mem_struct.uordblks ); - printf(" MALLOC-Free: %u bytes\n", mem_struct.fordblks); - printf(" Number of chunks from OS not in use by MALLOC: %u \n", mem_struct.ordblks); - printf(" TOP-releasable chunk keepcost: %u bytes \n\n", mem_struct.keepcost); - - printf("\n-------------- HEAPMON MEMORY MARKER SPECIFIC INFO -------\n"); - printf(" Cumulative allocated memory size: %llu bytes\n", total_allocated); - printf(" Cumulative deallocated memory: %llu bytes \n", total_freed); - printf(" Number of allocations: %llu bytes \n", number_allocated); - printf(" Number of deallocations: %llu \n", number_freed); - printf(" Number of zero allocations: %llu\n", number_zero_allocated); - printf(" Number of zero ptr deallocations: %llu\n", number_zeroptr_freed); - printf("-----------------------------------------------------------\n\n"); - break; - case 1: - - mem_struct = mallinfo(); - printf("\n-------------- TCMALLOC INFO -------------------------\n"); - printf(" MemoryMarker->get_test tcmalloc gFlags = %ld\n", gFlags); - printf(" SBRK-allocated Memory( ARENA) size: %u bytes\n", mem_struct.arena); - //printf(" MMAP-Allocated Memory: %u\n", mem_struct.hblkhd); - //printf(" Number of chunks allocated by MMAP: %u\n", mem_struct.hblks); - printf(" MALLOC-In Use: %u bytes \n", mem_struct.uordblks ); - printf(" MALLOC-Free: %u bytes \n", mem_struct.fordblks); - //printf(" Number of chunks from OS not in use by MALLOC: %u\n", mem_struct.ordblks); - //printf(" Top-releasable chunk keepcost: %u\n", mem_struct.keepcost); - printf("-----------------------------------------------------------\n\n"); - - - MallocExtension_GetStats(buffer, 512); - printf(" MemoryMarker->get_malloc_info() tcmalloc gFlags = %ld\n", gFlags); - printf(" tcmalloc stats: %s", buffer); - - printf("\n-------------- HEAPMON MEMORY MARKER SPECIFIC INFO -------\n"); - printf(" Cumulative allocated memory size: %llu\n", total_allocated); - printf(" Cumulative deallocated memory: %llu\n", total_freed); - printf(" Number of allocations: %llu\n", number_allocated); - printf(" Number of deallocations: %llu\n", number_freed); - printf(" Number of zero allocations: %llu\n", number_zero_allocated); - printf(" Number of zero ptr deallocations: %llu\n", number_zeroptr_freed); - printf("-----------------------------------------------------------\n\n"); - - - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - printf("\n-------------- HEAPMON MEMORY MARKER SPECIFIC INFO -------\n"); - printf(" Cumulative allocated memory size: %llu\n", total_allocated); - printf(" Cumulative deallocated memory: %llu\n", total_freed); - printf(" Number of allocations: %llu\n", number_allocated); - printf(" Number of deallocations: %llu\n", number_freed); - printf(" Number of zero allocations: %llu\n", number_zero_allocated); - printf(" Number of zero ptr deallocations: %llu\n", number_zeroptr_freed); - printf("-----------------------------------------------------------\n\n"); - - } -} - -/* _________________________________________________________________________ */ -static void mm_Hooks_install() { - - if ( gFlags & IS_RUNNING ) { - switch(USETCMALLOC){ - case 0: - //printf(" MemoryMarker->mm_Hooks_install(): mm_Hooks installed. gFlags = %u\n", gFlags); - __free_hook = mm_FreeHook; - /*__malloc_hook = mm_MallocHook; - __realloc_hook = mm_ReallocHook;*/ - break; - case 1: - printf(" MemoryMarker->mm_Hooks_install() tcmalloc gFlags = %ld\n", gFlags); - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } - - } else{ - printf(" MemoryMarker->mm_Hooks_install(): mm_Hooks failed to install. IS_RUNNING not set, gFlags = %ld\n", gFlags); - } - return ; -} - -static void tc_Hooks_install() { - if ( gFlags & IS_RUNNING ) { - printf(" MemoryMarker->tc_Hooks_install(): do nothing! gFlags = %ld\n", gFlags); - - } else{ - printf(" MemoryMarker->tc_Hooks_install(): 'IS_RUNNING' not set, gFlags = %ld do nothing!\n", gFlags); - } - return ; -} - -/* _________________________________________________________________________ */ -static void mm_Hooks_uninstall() { - switch(USETCMALLOC){ - case 0: - //printf(" MemoryMarker->mm_Hooks_uninstall(), gFlags = %u\n", gFlags); - __free_hook = m_OldFreeHook; - /*__malloc_hook = m_OldMallocHook; - __realloc_hook = m_OldReallocHook;*/ - break; - case 1: - printf(" MemoryMarker->mm_Hooks_uninstall() tcmalloc gFlags = %ld\n", gFlags); - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } -} - -/* _________________________________________________________________________ */ -static void mm_Hooks_start() { - if ( (gFlags & IS_RUNNING) ){ - switch(USETCMALLOC){ - case 0: - printf(" MemoryMarker->mm_Hooks_start()."); - mm_Hooks_save(); - mm_Hooks_install();//__free_hook = mm_FreeHook; - break; - case 1: - if (!(gFlags & IS_MARKING)){ - printf(" MemoryMarker->tc_Hooks_start()."); - old_tcFree_hook_ = MallocHook_SetDeleteHook(tc_FreeHook); - //old_tcMalloc_hook_ = MallocHook_SetNewHook(tc_MallocHook); - if (old_tcFree_hook_) - printf(" MemoryMarker-> HeapMon Delete hook set and old_tcFree_hook successfully saved"); - //if (old_tcMalloc_hook_ != NULL) - //printf(" MemoryMarker-> HeapMon New hook set and old_tcMalloc_hook successfully saved"); - } else{ - printf(" MemoryMarker-> HeapMon hook has been already set"); - } - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } - gFlags |= IS_MARKING; - printf(" IS_MARKING flag raised, gFlags = %ld!\n", gFlags); - } else { - printf(" MemoryMarker->mm_Hooks_start(): Attempt failed: IS_RUNNING flag is not set, gFlags = %ld!\n", gFlags); - } -} - -/* _________________________________________________________________________ */ -static void mm_Hooks_stop() { - if (gFlags & IS_MARKING){ - switch(USETCMALLOC){ - case 0: - printf(" MemoryMarker->mm_Hooks_stop(): old hooks restored and IS_MARKING dropped"); - //__free_hook = m_OldFreeHook; - mm_Hooks_uninstall(); - break; - case 1: - printf(" MemoryMarker->mm_Hooks_stop(): old tc_hooks restored\n"); - if (MallocHook_SetDeleteHook(old_tcFree_hook_)!=NULL) - printf(" old tcmalloc Delete hook restored!\n"); - //if (MallocHook_SetNewHook(old_tcMalloc_hook_)!=NULL) - //printf(" old tcmalloc New hook restored!\n"); - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } - - gFlags &= gFlags ^ IS_MARKING; - printf(", gFlags = %ld\n", gFlags); - } else{ - printf(" MemoryMarker->mm_Hooks_stop(): Attempt failed (IS_MARKING not raised) gFlags = %ld. \n", gFlags); - } -} - -/* _________________________________________________________________________ */ -static void mm_Hooks_atexit() { - printf(" MemoryMarker->mm_Hooks_atexit(): mm_Hooks _uninstall(). gFlags = %ld\n", gFlags); - - switch(USETCMALLOC){ - case 0: - /* reset (system/NULL) hook to prevent tracking */ - mm_Hooks_uninstall(); - break; - case 1: - printf(" MemoryMarker->mm_Hooks_atexit(): tc_Hooks _uninstall()\n"); - if (old_tcFree_hook_!=NULL){ - if (MallocHook_SetDeleteHook(old_tcFree_hook_)!=NULL) - printf(" old tcmalloc Delete hook restored successfull!\n"); - //if (MallocHook_SetNewHook(old_tcMalloc_hook_)!=NULL) - //printf(" old tcmalloc New hook restored successfull!\n"); - } - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - } - - gFlags &= gFlags ^ IS_MARKING; - gFlags &= gFlags ^ IS_RUNNING; - printf(" MemoryMarker->mm_Hooks_atexit(): IS_MARKING and IS_RUNNING flags dropped gFlags = %ld\n", gFlags); -} - - -/* _________________________________________________________________________ */ -static void *mm_MallocHook( size_t size, const void *unused ) { - void *result; - -/* reset (system/NULL) hook to prevent recursion */ - mm_Hooks_uninstall(); - -/* let malloc do its thing */ - result = malloc( size ); - - if (size > 8 && result!=0) - memset(result, NEW_MARKER, size - 8); - -/* store current hooks */ - mm_Hooks_save(); - -/* reset tracker hook */ - mm_Hooks_install(); - - return result; -} - -/* _________________________________________________________________________ */ -static void *mm_ReallocHook( void *ptr, size_t size, const void *unused ) { - void *result; - -/* reset (system/NULL) hook to prevent recursion */ - mm_Hooks_uninstall(); - -/* let realloc do its thing */ - result = realloc( ptr, size ); - - //memset(result, NEW_MARKER, size); - -/* store current hooks */ - mm_Hooks_save(); - -/* reset tracker hook */ - mm_Hooks_install(); - - return result; -} - -void *secureMemset(void *v, int c,size_t n) { - volatile char *p = v; - while (n--) - *p++ = c; - - return v; -} - -static void tc_MallocHook(const void* ptr, size_t size){ - if (size == 0){ - //printf(" alloc_size=0 "); - number_zero_allocated+=1; - } else { - - total_allocated +=size; - number_allocated +=1; - - /*if (size > 1) - memset(ptr, FREE_MARKER, object_size - 1);*/ - - if (size > 50000) - printf("malloc=%zu", size); - } - -} - -static void tc_FreeHook(const void *ptrv) { - size_t* ptr = (size_t *) ptrv; - if( ptr!=NULL && ptr!=0){ - //printf("ptr=%x", ptr); - size_t object_size = 0; - object_size = MallocExtension_GetAllocatedSize(ptr); - - if (object_size < 1) - return; - total_freed +=object_size; - number_freed +=1; - if (object_size < 2){ - printf("free=1"); - memset(ptr , FREE_MARKER, object_size - 2 ); - } else if (object_size < 10){ - //printf("`"); - memset(ptr, FREE_MARKER, object_size - 2 ); - } else if (object_size < 250){ //14 size_t memory slots - //printf("!"); - memset(ptr , FREE_MARKER, object_size - 8 ); - } else if (object_size < 350){ - //printf("#"); - memset(ptr + 50, FREE_MARKER, 16); - memset(ptr + 52, SIZE_MARK, 12); - - char* cp_ptr = (char*)(ptr + 53); //pointer to the memory where object_size is recorded byte-by-byte - char* cp_object_size = (char *)(&object_size); // get the value stored at pI - int x = 0; - for( x = 0; x < sizeof(object_size); x++){ - char temp = *cp_object_size; // get the value of first byte of object_size - memset(cp_ptr + x, temp, 1); - cp_object_size++; // Point to next byte of object_size - } - } else { - - //printf("$"); - //memset(ptr, FREE_MARKER, object_size - 8); - memset(ptr + 50, FREE_MARKER, 16); - memset(ptr + 52, SIZE_MARK, 12); - - char* cp_ptr = (char*)(ptr + 53); //pointer to the memory where object_size is recorded byte-by-byte - char* cp_object_size = (char *)(&object_size); // get the value stored at pI - int x = 0; - for( x = 0; x < sizeof(object_size); x++){ - char temp = *cp_object_size; // get the value of the x-th byte of object_size - memset(cp_ptr + x, temp, 1); - cp_object_size++; // Point to next byte of object_size - } - /*if(object_size >= 350 && object_size <=450){ - int y=0; - for(y = 0; y < 5; y++){ - //printf(" ptr=%x, value=%u(%x) ",ptr+y, *((long *) (ptr+y)), *((long *) (ptr+y))); - } - }*/ - } - } else{ - //printf("ptr=NULL/0"); - number_zeroptr_freed += 1; - } -} - -/* _________________________________________________________________________ */ -static void mm_FreeHook( void *ptr, const void *caller ) { -/* reset (system/NULL) hook to prevent recursion */ - mm_Hooks_uninstall(); - - size_t* chunk_ptr ; - size_t* next_chunk_ptr; - unsigned long object_size = 0; - unsigned long chunk_size = 0; - - if(ptr){ - chunk_ptr = (size_t*)((char*)ptr-1*sizeof(size_t)); - chunk_size = (*chunk_ptr) & ~LOWER_THREE_BITS; - //object_size = ((*chunk_ptr) & ~LOWER_THREE_BITS) - 2*sizeof(size_t); - object_size = chunk_size - 2*sizeof(size_t); - memset(ptr, FREE_MARKER, object_size); - } - free( ptr ); - -/* store current hooks */ - mm_Hooks_save(); - -/* reset tracker hook */ - mm_Hooks_install(); - -} - - -/*========================================================================== */ -/* startup and shutdown */ -/*========================================================================== */ -static void setup() __attribute__ ((constructor)); -static void report() __attribute__ ((destructor)); - -/* _________________________________________________________________________ */ -static void setup() { - printf("MemoryMarker->setup()->mm_Hooks_save()\n"); - //find out if tcmalloc was loaded - USETCMALLOC = strcmp(getenv("USETCMALLOC"), "true") ? 0 : 1; - printf(" USETCMALLOC=%d", USETCMALLOC); - if (USETCMALLOC) { - printf(" tcmalloc is loaded \n"); - } else { - printf(" glibc malloc is working \n"); - mm_Hooks_save(); - } - -} - -/* _________________________________________________________________________ */ -static void report() { - static int finalized = 0; - printf("MemoryMarker->report()->mm_Hooks_uninstall()\n"); - //unsigned int iname; - // finalized = 1; - - /* reset (system/NULL) as we're done now */ - mm_Hooks_uninstall(); - -} - - -/*========================================================================== */ -/* python interface module */ -/*========================================================================== */ -#define CPPTOPYTHON( fname ) \ -static PyObject* hep_##fname( PyObject* unused, PyObject* args ) { \ - if ( ! PyArg_ParseTuple( args, (char*)":"#fname ) ) \ - return 0; \ - \ - mm_Hooks_##fname(); \ - \ - Py_INCREF( Py_None ); \ - return Py_None; \ -} -CPPTOPYTHON( install ) -CPPTOPYTHON( start ) -CPPTOPYTHON( stop ) -CPPTOPYTHON( uninstall ) -CPPTOPYTHON( atexit ) - -/* _________________________________________________________________________ */ -#define CPPTOPYTHONWITHSTRING( fname ) \ -static PyObject* hep_##fname( PyObject* unused, PyObject* args ) { \ - const char *name; \ - PyStringObject* pyname = 0; \ - if ( ! PyArg_ParseTuple( args, (char*)"S:"#fname, &pyname ) ) \ - return 0; \ - \ - name = PyString_AS_STRING( pyname ); \ - fname( name ); \ - \ - Py_INCREF( Py_None ); \ - return Py_None; \ -} -CPPTOPYTHONWITHSTRING( trace ) -CPPTOPYTHONWITHSTRING( ignore ) - -/* _________________________________________________________________________ */ -#define CPPTOPYTHONWITHINT( fname ) \ -static PyObject* hep_##fname( PyObject* unused, PyObject* args ) { \ - int i,res; \ - if ( ! PyArg_ParseTuple( args, "i", &i ) ) \ - return 0; \ - \ - res = mm_##fname( i ); \ - return Py_BuildValue( "i", res ); \ -} -CPPTOPYTHONWITHINT( check ) -CPPTOPYTHONWITHINT( clearCheckPoint ) -CPPTOPYTHONWITHINT( depth ) - -static PyObject* hep_set_marker(PyObject* unused, PyObject* args ){ - char c; - if (! PyArg_ParseTuple(args, "c", &c) ) - return 0; - set_marker(c); - - Py_INCREF( Py_None ); \ - return Py_None; -} - -static PyObject* hep_get_marker(PyObject* unused, PyObject* args ){ - PyObject* py_return = 0; - py_return = Py_BuildValue("c", FREE_MARKER); - return py_return; -} - -/* _________________________________________________________________________ */ -static PyObject* hep_setCheckPoint( PyObject* unused, PyObject* args ) { - int res = mm_setCheckPoint(); - return Py_BuildValue( "i", res ); -} - -/* _________________________________________________________________________ */ -static PyObject* hep_configure( PyObject* unused, PyObject* args ) { - long flags = 0; - if ( ! PyArg_ParseTuple( args, (char*)"|l:configure", &flags ) ) - return 0; - - flags = configure( flags ); - - return PyLong_FromLong( flags ); -} - -static PyObject* hep_get_trace( PyObject* unused, PyObject* args ) { - long key = 0; - if ( ! PyArg_ParseTuple( args, (char*)"|l:get_trace", &key ) ) - return 0; - - get_trace( key ); - - Py_INCREF( Py_None ); - return Py_None; -} - -static PyObject* hep_get_test( PyObject* unused, PyObject* args ) { - long key = 0; - if ( ! PyArg_ParseTuple( args, (char*)"|l:get_test", &key ) ) - return 0; - - get_test( key ); - - Py_INCREF( Py_None ); - return Py_None; -} - -static PyObject* hep_store_malloc_info( PyObject* unused, PyObject* args ) { - unsigned int number = 0; - const char * name; - PyStringObject* pyname = 0; - - if ( ! PyArg_ParseTuple( args, (char*)"is:store_malloc_info", &number, &pyname) ) - return 0; - - name = PyString_AS_STRING( pyname ); - //store_malloc_info(number, name); - - Py_INCREF( Py_None ); - return Py_None; -} - -static PyObject* hep_get_malloc_info( PyObject* unused, PyObject* args ) { - PyStringObject* pyname = 0; - PyObject* py_return = 0; - struct mallinfo mem_struct; - mem_struct = mallinfo(); - - switch(USETCMALLOC){ - case 0: //ptmalloc(glibc) - /* reset (system/NULL) hook to prevent tracking */ - /*printf(" sbrk-Allocated Memory( ARENA) size: %lu\n", mem_struct.arena); - printf(" MMAP-Allocated Memory: %lu\n", mem_struct.hblkhd); - printf(" Number of chunks allocated by MMAP: %lu\n", mem_struct.hblks); - printf(" MALLOC-In Use: %lu\n", mem_struct.uordblks ); - printf(" MALLOC-Free: %lu\n", mem_struct.fordblks); - printf(" Number of chunks from OS not in use by MALLOC: %lu\n", mem_struct.ordblks); - printf(" Top-releasable chunk keepcost: %lu\n", mem_struct.keepcost);*/ - - py_return = Py_BuildValue("llll", - mem_struct.arena/1024, //sbrk - mem_struct.hblkhd/1024, //mmap - mem_struct.uordblks/1024, //inuse - mem_struct.fordblks/1024);//free - break; - case 1: //tcmalloc - py_return = Py_BuildValue("llll", - mem_struct.arena/1024, //sbrk - 1, //for tcmalloc not defined - mem_struct.uordblks/1024, //inuse - mem_struct.fordblks/1024);//free - //get_malloc_info(); - break; - default: - printf(" Invalid USETCMALLOC key: %d", USETCMALLOC); - show_malloc_info(); - } - - return py_return; -} - -static PyObject* hep_show_info( PyObject* unused, PyObject* args ) { - show_malloc_info( ); - Py_INCREF( Py_None ); - return Py_None; -} - -static PyObject* hep_get_key_list( PyObject* unused, PyObject* args ) { - long key = 0; - if ( ! PyArg_ParseTuple( args, (char*)"|l:get_key_list", &key ) ) - return 0; - - get_key_list( ); - - Py_INCREF( Py_None ); - return Py_None; -} - -/* _________________________________________________________________________ */ -static PyObject* hep_outstream( PyObject* unused, PyObject* args ) { - PyObject* pyfile; - if ( ! PyArg_ParseTuple( args, "O!", &PyFile_Type, &pyfile ) ) - return 0; - - FILE* fp = PyFile_AsFile( pyfile ); - if ( ! fp ) - return 0; - - int fd = dup( fileno( fp ) ); - - file_output = fdopen( fd, "w" ); - - Py_INCREF( Py_None ); - return Py_None; -} - -/* _________________________________________________________________________ */ -static PyMethodDef gMemoryMarkerMethods[] = { - { (char*)"install", (PyCFunction)hep_install, METH_VARARGS, (char*)"install/start marking" }, - { (char*)"start", (PyCFunction)hep_start, METH_VARARGS, (char*)"start marking" }, - { (char*)"stop", (PyCFunction)hep_stop, METH_VARARGS, (char*)"stop marking" }, - { (char*)"uninstall", (PyCFunction)hep_uninstall, METH_VARARGS, (char*)"uninstall marking" }, - { (char*)"atexit", (PyCFunction)hep_atexit, METH_VARARGS, (char*)"atexit handler" }, - { (char*)"ignore", (PyCFunction)hep_ignore, METH_VARARGS, (char*)"ignore memory marking by dropping IS_MARKING flag" }, - { (char*)"configure", (PyCFunction)hep_configure, METH_VARARGS, (char*)"prepare for memory marking by raising IS_MARKING flag" }, - { (char*)"outstream", (PyCFunction)hep_outstream, METH_VARARGS, (char*)"set new outstream" }, - { (char*)"get_test", (PyCFunction)hep_get_test, METH_VARARGS, (char*)"get test information" }, - { (char*)"store_malloc_info", (PyCFunction)hep_store_malloc_info, METH_VARARGS, (char*)"store Malloc-info into ROOT file using C++ extern function - doesn't work for now" }, - { (char*)"get_malloc_info", (PyCFunction)hep_get_malloc_info, METH_VARARGS, (char*)"get Malloc-info in the tuple" }, - { (char*)"show_info", (PyCFunction)hep_show_info, METH_VARARGS, (char*)"show mempory usage info" }, - { (char*)"set_marker", (PyCFunction)hep_set_marker, METH_VARARGS, (char*)"set marker_char to build marker" }, - { (char*)"get_marker", (PyCFunction)hep_get_marker, METH_VARARGS, (char*)"get current marker_char" }, - { NULL, NULL, 0, NULL } -}; - - -/* _________________________________________________________________________ */ -void initMemoryMarker() { - PyObject *memmark; - - memmark = Py_InitModule( (char*)"MemoryMarker", gMemoryMarkerMethods ); - -/* configuration flags */ - PyModule_AddObject( memmark, (char*)"LEAK_CHECK", PyLong_FromLong( LEAK_CHECK ) ); - PyModule_AddObject( memmark, (char*)"PROFILE", PyLong_FromLong( PROFILE ) ); - PyModule_AddObject( memmark, (char*)"HIDEMEMADDR",PyLong_FromLong( HIDEMEMADDR ) ); - PyModule_AddObject( memmark, (char*)"QUICK", PyLong_FromLong( QUICK ) ); - PyModule_AddObject( memmark, (char*)"STL_CHECKS", PyLong_FromLong( STL_CHECKS ) ); - PyModule_AddObject( memmark, (char*)"FILTER_STL", PyLong_FromLong( FILTER_STL ) ); - PyModule_AddObject( memmark, (char*)"IS_MARKING", PyLong_FromLong( IS_MARKING ) ); - PyModule_AddObject( memmark, (char*)"IS_RUNNING", PyLong_FromLong( IS_RUNNING ) ); -} - -#endif diff --git a/Control/HeapMon/src/MemoryScanner.cxx b/Control/HeapMon/src/MemoryScanner.cxx deleted file mode 100644 index ab0945c2e342ac4dc55f98e818d4e30e0a0528d8..0000000000000000000000000000000000000000 --- a/Control/HeapMon/src/MemoryScanner.cxx +++ /dev/null @@ -1,490 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -/* -MEMORY SCANNER -*/ - -// standard includes -#include <iostream> -using namespace std; - -// C includes -#include <errno.h> -#include <fcntl.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> - - -//system includes -#include <sys/types.h> -#include <sys/ptrace.h> -#include <sys/wait.h> -#include <sys/stat.h> - -// STL includes -#include <map> -#include <vector> -#include <iostream> -#include <iterator> - -// ROOT includes -#include <TTree.h> -#include <TFile.h> -#include <TF1.h> -#include <TH1.h> -#include <TH2.h> -#ifdef __APPLE__ -#define PTRACE_ATTACH PT_ATTACH -#define PTRACE_DETACH PT_DETACH -#endif - -int usage( char* name ){ - cout << "usage: " << name <<" <pid> <scan_flag=0|1|2|3|4> <scan_number> <output_file_name> <marker-type(not-used-yet)>\n"; - return 2; -} - - -int main( int argc, char *argv[] ){ - typedef unsigned int ms_uint64; - typedef unsigned int ms_uint32; - - int result = -1; - FILE *maps = 0; - FILE *statusf = 0; - int mem = 0; - pid_t pid = 0; - - unsigned short int SCAN_FLAG = 0; - unsigned short int scan_number = 0; - - char mapfile[128], memfile[128], statusfile[128]; - char *buffer = NULL; - - ms_uint32 marker = 0xCDCDCDCD; // new_marker = 0xBCBCBCBC; - ms_uint32 size_mark = 0xFBFBFBFB; - ms_uint64 addr_start = 0, addr_end = 0; - - siginfo_t *infop = NULL; - char perm[3]; - - - // Parsing of arguments - if ( argc != 6 ) - return usage( argv[0] ); - -#ifndef __APPLE__ - - pid = atoi( argv[1] ); - SCAN_FLAG = atoi( argv[2]); - scan_number = atoi (argv[3]); - char* file_name = argv[4]; - unsigned char marker_char = atoi(argv[5]); // "the color" of memory painting - - marker = (marker_char << 24) + - (marker_char << 16) + - (marker_char << 8) + - marker_char; // 0xCD converted -> 0xCDCDCDCD - cout << " MemoryScanner: marker_char = " << marker_char << " marker = " - << marker << endl; - cout << " MemoryScanner: scan_flag = " << SCAN_FLAG << endl; - switch ( SCAN_FLAG ) { - case 0 : - cout << "MemoryScanner: std output, no file output produced" ; - break; - - case 1 : - cout << "MemoryScanner: full output of hole statistics and malloc/process memory info into " << file_name << "\n"; - break; - - case 2 : - cout << "MemoryScanner: malloc/process memory info output into " << file_name << "\n"; - break; - - default : - // Process for all other cases. - cout << "MemoryScanner: ERROR - Wrong scan_flag=" << SCAN_FLAG <<" provided.\n"; - return usage( argv[0] ); - - } - - cout <<"\n MemoryScanner: scan_number=" << scan_number <<" \n"; - - - //auxiliary buffer for reading bits from proc/mem file - const ms_uint64 aux_buffer_size = 1024; // 4096bytes >> 2 = 1024 size_t elements! - cout << "\n buffer_page_size =" << aux_buffer_size <<" bytes "<< endl; - size_t aux_buffer[aux_buffer_size]; - //size_t mem_size = addr_end - addr_start; - - //Declaration of counters - ms_uint64 counter = 0; // marker pieces ('CDCDCDCD') counter - ms_uint64 block_counter = 0; // marked blockes ('CDCD...CDCD') counter - ms_uint64 maprange_counter = 0; - - //Declaration of size variables - - ms_uint64 maps_total_size = 0; // Total maps in /proc/PID/maps - ms_uint64 mem_total_size = 0; // Total scanned maps (excluding the ranges with no 'wr' permission) - ms_uint64 block_total_size = 0;// Total holes size - ms_uint64 mapsSize = 0, holesSize = 0; //memSize = 0, ; - - ms_uint64 malloc_total = 0; - - //Declaration of Marked block related variables - ms_uint64 block_flag = 0; - ms_uint64 block_size = 0; - ms_uint64 block_start = 0; // auxiliary to remember block start location - size_t* block_ptr = 0; - size_t* block_end_ptr = 0; - size_t* addr = 0; - - //variables related to the TTree building - ms_uint64 hole_addr = (ms_uint64) (size_t) block_ptr; - ms_uint64 hole_size = (ms_uint64) (size_t) block_size; - - - - //--------------------------------------------------// - // ATTACHING To the pid Process - // the %pid-Process restores operation after the MemoryScanner finishes it's job - //--------------------------------------------------// - cout << "using marker: " << marker << endl; - cout << "halting process: " << pid << endl; - result = ptrace( PTRACE_ATTACH, pid, NULL, NULL ); - if ( result == -1 ) { - cerr << " MemoryScanner: ERROR - cannot attach to the " << pid << " process \n"; - exit( -1 ); - } - waitid( P_PID, pid, infop, WSTOPPED ); - - //------------------------------------------------------// - // READING /proc/%PID/status file - //------------------------------------------------------// - char line [128]; /* or other suitable maximum line size */ - char head_buffer[6];//char* head_buffer; - char tail_buffer[10];//char* tail_buffer; - snprintf( statusfile, 128, "/proc/%u/status", pid ); - statusf = fopen ( statusfile, "r" ); - cout << "opened /proc/" << pid << "/status file \n"; - - ms_uint32 tag_value; - ms_uint32 VmSize=0, VmLck=0, VmRSS=0, VmData=0, VmStk=0, VmExe=0, VmLib=0; - - if ( statusf != NULL ){ - while ( fgets ( line, sizeof line, statusf ) != NULL) /* read a line */{ - sscanf( line, "%5s %80u %9s", head_buffer, &tag_value, tail_buffer); - //cout <<"h_buffer=" << head_buffer << " tag_value=" << tag_value << " t_buffer=" << tail_buffer << "\n"; - if (strncmp(head_buffer, "VmSize",5) == 0){ - VmSize = tag_value; - } else if (strncmp(head_buffer, "VmLck", 5) == 0){ - VmLck = tag_value; - } else if (strncmp(head_buffer, "VmRSS", 5) == 0){ - VmRSS = tag_value; - } else if (strncmp(head_buffer, "VmData",5) == 0){ - VmData = tag_value; - } else if (strncmp(head_buffer, "VmStk", 5) == 0){ - VmStk = tag_value; - } else if (strncmp(head_buffer, "VmExe", 5) == 0){ - VmExe = tag_value; - } else if (strncmp(head_buffer, "VmLib", 5) == 0){ - VmLib = tag_value; - } - } - fclose ( statusf ); - } - else{ - perror ( statusfile); /* why didn't the file open? */ - } - cout << "VmSize=" << VmSize << " VmRSS=" << VmRSS << " VmData=" << VmData - << "VmStk=" << VmStk << "VmExe=" << VmExe << "VmLib=" << VmLib << endl; - - - - //---------------------------------------------------------// - // READING /proc/%PID/maps file - //---------------------------------------------------------// - snprintf( mapfile, 128, "/proc/%u/maps", pid ); - maps = fopen( mapfile, "r" ); - if( ! maps ) { - cerr << " MemoryScanner: ERROR - accessing /proc/" << pid <<"/maps file \n"; - exit( -1 ); - } - cout << "opened mapfile:" << mapfile << "\n"; - - //-------------------------------------------------------// - // Handle to /proc/%PID/mem file - //-------------------------------------------------------// - snprintf( memfile, 128, "/proc/%u/mem", pid ); - mem = open( memfile, O_RDONLY, NULL ); - if ( mem == -1 ) { - cerr << " MemoryScanner: ERROR - accessing /proc/" << pid << "/mem file \n"; - exit( -1 ); - } - cout << "opened memfile: " << memfile << endl; - - - // ROOT Declarations - TFile *memFile ; - TTree *memTree; - TTree *infoTree; - - if (scan_number == 0){ - cout << " Prepare the memFile = " << file_name << "\n"; - TTree *mallocTree; - - memFile = new TFile(file_name, "recreate"); - - // create hole statistics tree and it's branches: - // start_addr,end_addr, scan_number, marker_char - memTree = new TTree("holeTree","memory_holes_data"); - memTree->Branch("hole_addr", &hole_addr,"hole_addr/i"); - memTree->Branch("hole_size", &hole_size, "hole_size/i"); - memTree->Branch("scan_number",&scan_number, "scan_number/s"); - memTree->Branch("hole_marker", &marker, "marker/i"); - - - // create process memory usage + hole info tree and it's branches: - infoTree = new TTree("infoTree","memory_usage_statistics"); - infoTree->Branch("total_hole_memory", &holesSize,"hole_mem/i"); - infoTree->Branch("total_hole_number", &block_counter,"hole_number/i"); - infoTree->Branch("hole_marker", &marker, "hole_marker/i"); - infoTree->Branch("total_maps_memory", &mapsSize, "maps_memory/i"); - infoTree->Branch("VmSize", &VmSize,"vmsize/i"); - infoTree->Branch("VmLck", &VmLck, "vmlck/i"); - infoTree->Branch("VmRSS", &VmRSS, "vmrss/i"); - infoTree->Branch("VmData", &VmData,"vmdata/i"); - infoTree->Branch("VmStk", &VmStk, "vmstk/i"); - infoTree->Branch("VmExe", &VmExe, "vmexe/i"); - infoTree->Branch("VmLib", &VmLib, "vmlib/i"); - infoTree->Branch("scan_number", &scan_number, "scan_number/s"); - - // create malloc info tree and it's branches: - mallocTree = new TTree("mallocTree","malloc_statistics"); - mallocTree->Branch("malloc_sbrk", &malloc_total, "sbrk/i"); - mallocTree->Branch("malloc_mmap", &malloc_total, "mmap/i"); - mallocTree->Branch("malloc_inuse", &malloc_total, "inuse/i"); - mallocTree->Branch("malloc_free", &malloc_total, "free/i"); - mallocTree->Branch("scan_number", &scan_number, "scan_number/s"); - - mallocTree->Fill(); - mallocTree->Print(); - mallocTree->Write(); - } else { - cout << " Update the memFile = " << file_name << "\n"; - memFile = TFile::Open(file_name, "update"); - memTree = (TTree*)memFile->Get("holeTree"); - infoTree = (TTree*)memFile->Get("infoTree"); - - //bind variables to the memTree for further update/filling - memTree->SetBranchAddress("hole_addr", &hole_addr); - memTree->SetBranchAddress("hole_size", &hole_size); - memTree->SetBranchAddress("scan_number",&scan_number); - memTree->SetBranchAddress("hole_marker", &marker); - - //bind variables to the infoTree for further update/filling - infoTree->SetBranchAddress("total_hole_memory", &holesSize); - infoTree->SetBranchAddress("total_hole_number", &block_counter); - infoTree->SetBranchAddress("total_maps_memory", &mapsSize); - infoTree->SetBranchAddress("hole_marker", &marker); - infoTree->SetBranchAddress("VmSize", &VmSize); - infoTree->SetBranchAddress("VmLck", &VmLck); - infoTree->SetBranchAddress("VmRSS", &VmRSS); - infoTree->SetBranchAddress("VmData", &VmData); - infoTree->SetBranchAddress("VmStk", &VmStk); - infoTree->SetBranchAddress("VmExe", &VmExe); - infoTree->SetBranchAddress("VmLib", &VmLib); - infoTree->SetBranchAddress("scan_number", &scan_number); - } - - - - - //----------------------------------------------------// - //Main Part: The actual memory scanning, first read /proc/%pid/maps file - //Then scan /proc/%pid/mem for marked holes - //----------------------------------------------------// - size_t len = 0; - while (getline(&buffer, &len, maps) > 0) { - sscanf( buffer, "%80x-%80x %2s", &addr_start, &addr_end, perm ); - maps_total_size += (addr_end - addr_start); - - if ( strcmp( perm, "rw" ) != 0 ){ - continue; - } - //cout << "addr_start=" << hex << addr_start << " addr_end=" << hex << addr_end << " prm=" << perm << "\n"; - - maprange_counter++; - mem_total_size += (addr_end - addr_start); - //mem_size = addr_end - addr_start; - - addr = (size_t*) (unsigned long) addr_start; - - switch ( SCAN_FLAG ) { - case 0 : - cout <<"Maps: " << hex << addr_start - << "-" << hex << addr_end - << " size=" << addr_end -addr_start << "/n"; - break; - - case 1 : - /*cout <<"Maps: " << hex << addr_start - << "-" << hex << addr_end - << " size=" << addr_end -addr_start << "/n";*/; - break; - - case 2 : - // cout << "Maps: " << hex << addr_start - break; - - default : - ;// Process for all other cases. - } - //these are auxiliary flags and variables to define the-size of CDCDCDCD and PINNED blocks - //CD blocks parameters - block_flag = 0; - block_size = 0; - block_ptr = 0; - block_end_ptr = 0; - result = 0; - - /* scan /proc/%pid/mem for marked holes */ - while ( (ms_uint64) (size_t) addr < addr_end && result != -1) { - - /*for (i=0; i<aux_buffer_size; i++) - aux_buffer[i] = 0;*/ - - result = pread( mem, &aux_buffer, sizeof(aux_buffer), (ms_uint64) (size_t) addr ); - if (result == -1){ - //cerr << " MemoryScanner: ERROR - reading mem at address" << addr << "\t" << "error=" << errno << " " << strerror(errno) << "\n"; - continue ; - } else if (result == 0){ - cerr << " MemoryScanner: WARNING - zero bytes read from mem at address" << addr <<"\n"; - continue ; - } - - int i; - - for (i=0; i<result; i++){ - if ( aux_buffer[i] == marker ) { - //Here block_flag==0 defines the beginning of the 'CDCDCDCD' memory block - if (block_flag==0) {//cout << "found CDCDCDCD block: " << endl; - block_start = counter; - block_ptr = addr + i; - block_counter++; // 'CDCDCDCD' block counter - block_flag=1; // forthcoming consecutive 'CDCDCDCD' are not the beginning - } - counter ++; //counter of 'CDCDCDCD' pieces - }else { //Here block_flag==1 defines the end of the 'CDCDCDCD' memory block - - //this condition for Tcmalloc marking of freed memmory - if (block_flag == 1) { - if (aux_buffer[i] == size_mark){ - if ((aux_buffer[i+2] == size_mark) && (aux_buffer[i+1]!=size_mark && aux_buffer[i+1] > 0)){ - if (aux_buffer[i+1] < 65000000) - counter += aux_buffer[i+1]/4 - 2; - } - } - block_flag = 0; - block_size = counter - block_start; - block_end_ptr = block_ptr + block_size; - //block_size=block_size*sizeof(size_t); - block_total_size += block_size; - hole_addr = (ms_uint64 ) (size_t) block_ptr; - //hole_end_addr = (ms_uint64 ) block_end_ptr; - //hole_size = hole_end_addr - hole_addr; - hole_size = block_size*sizeof(size_t); - - switch ( SCAN_FLAG ) { - case 0 : - cout <<"C:\t" << hex << block_ptr <<"-" << hex << block_end_ptr ; - cout << " size=" << block_size; - cout << " counter="<< counter << "\n"; - break; - - case 1 : - memTree -> Fill(); - break; - case 2 : - /*if(scan_number < report_scan_number) - memTree -> Fill()*/; - break; - - default : - ;// Process for all other cases. - } - - } - }//if - }//for - addr += aux_buffer_size; - }//inner-while-end - - //cout << "hs=" << dec << 4*block_total_size << " c=" << 4*counter << " map_range=" << hex << (size_t*) addr_start << "-" << (size_t*)addr_end << " map_size=" << dec << addr_end - addr_start << " len= "<< len<<"\n"; - len = 1; - }//outer-while-end - - -//FINISHED SCANNING of the MEMORY - close( mem ); - fclose( maps ); - cout << "resuming process:" << pid << endl ; - - result = ptrace( PTRACE_DETACH, pid, NULL, NULL ); - if ( result == -1 ) { - cerr << "MemoryScanner: ERROR " << errno << " " << strerror(errno) << "\n"; - exit( -1 ); - } - - - switch ( SCAN_FLAG ) { - case 0 : - // Process for scan_flag = 0 - cout <<"TOTAL FOUND for scan_number: " << scan_number << "\n"; - cout << maprange_counter << " MAP_RANGES scanned"<< "\n"; - cout << block_counter << " MARKED-Blocks" << "\n"; - cout << counter << " MARKED-pieces" << "\n"; - cout << maps_total_size << "(" << maps_total_size*1.0/(1048576.0) << " Mb)- TOTAL MAPS MEMORY SIZE \n"; - cout << mem_total_size << "(" << mem_total_size*1.0/(1048576.0) << " Mb)- TOTAL SCANNED MEMORY SIZE\n"; - cout <<4*block_total_size<< "(" << 4.0*block_total_size/(1048576.0) << " Mb)- MARKED blocks MEMORY SIZE\n"; - cout <<4*counter << "(" << 4.0*counter/(1048576.0) << " Mb)- MARKED pieces MEMORY SIZE\n"; - - break; - - case 1: case 2 : - // Process for scan_flag = 1 - cout <<"TOTAL FOUND for scan_number: " << scan_number << "\n"; - cout << maprange_counter << " MAP_RANGES scanned"<< "\n"; - cout << block_counter << " MARKED-Blocks" << "\n"; - cout << counter << " MARKED-pieces" << "\n"; - cout << maps_total_size << "(" << maps_total_size*1.0/(1048576.0) << " Mb)- TOTAL MAPS MEMORY SIZE \n"; - cout << mem_total_size << "(" << mem_total_size*1.0/(1048576.0) << " Mb)- TOTAL SCANNED MEMORY SIZE\n"; - cout <<4*block_total_size<< "(" << 4.0*block_total_size/(1048576.0) << " Mb)- MARKED blocks MEMORY SIZE\n"; - cout <<4*counter << "(" << 4.0*counter/(1048576.0) << " Mb)- MARKED pieces MEMORY SIZE\n"; - - memFile->cd(); - memTree->Write(); - mapsSize = maps_total_size/1024; - holesSize = 4*block_total_size/1024; - infoTree->Fill(); - infoTree->Write(); - memTree->Delete(); - infoTree->Delete(); - memFile->Close(); - break; - - default : - // Process for all other cases. - memTree->Delete(); - infoTree->Delete(); - memFile->Close(); - } -#endif - - return 0; -} - - diff --git a/Control/HeapMon/src/tcmalloc_dummy.c b/Control/HeapMon/src/tcmalloc_dummy.c deleted file mode 100644 index 3122b45a8c3e70873602272f8616b13c37bc9cf0..0000000000000000000000000000000000000000 --- a/Control/HeapMon/src/tcmalloc_dummy.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -#include <gperftools/malloc_hook_c.h> - - -size_t MallocExtension_GetAllocatedSize(void* p){ - return 0; -} - -MallocHook_NewHook MallocHook_SetNewHook(MallocHook_NewHook hook) { - //printf("dummy"); - return 0; -} - -MallocHook_DeleteHook MallocHook_SetDeleteHook(MallocHook_DeleteHook hook) { - //printf("dummy"); - return 0; -} - -void MallocExtension_GetStats(char* buffer, int buffer_length){ - return ; -} - -