diff options
author | Andrew Au <andrewau@microsoft.com> | 2019-03-18 15:19:45 -0700 |
---|---|---|
committer | Andrew Au <cshung@gmail.com> | 2019-03-21 17:11:06 -0400 |
commit | a7c9ca110096c27de23f045cd176c2109d0676d9 (patch) | |
tree | 45dd6a3064babadad30f4746b7ab9864f6a00055 /src/scripts | |
parent | ceca0a77e8b48e30f9c6b67d2992c3276aba2177 (diff) | |
download | coreclr-a7c9ca110096c27de23f045cd176c2109d0676d9.tar.gz coreclr-a7c9ca110096c27de23f045cd176c2109d0676d9.tar.bz2 coreclr-a7c9ca110096c27de23f045cd176c2109d0676d9.zip |
Avoid stack walk as specified in the exclusion list
Diffstat (limited to 'src/scripts')
-rw-r--r-- | src/scripts/genEtwProvider.py | 53 | ||||
-rw-r--r-- | src/scripts/genEventPipe.py | 29 | ||||
-rw-r--r-- | src/scripts/utilities.py | 46 |
3 files changed, 69 insertions, 59 deletions
diff --git a/src/scripts/genEtwProvider.py b/src/scripts/genEtwProvider.py index 79a286a501..89d3119cf4 100644 --- a/src/scripts/genEtwProvider.py +++ b/src/scripts/genEtwProvider.py @@ -14,7 +14,7 @@ import argparse import subprocess import xml.dom.minidom as DOM from genEventing import parseTemplateNodes -from utilities import open_for_update, update_directory +from utilities import open_for_update, update_directory, parseExclusionList macroheader_filename = "etwmacros.h" mcheader_filename = "ClrEtwAll.h" @@ -102,59 +102,12 @@ def genXplatHeader(intermediate): #endif //_CLR_XPLAT_EVENTS_H_ """.format(etw_dirname, macroheader_filename, mcheader_filename)) - -class EventExclusions: - def __init__(self): - self.nostack = set() - self.explicitstack = set() - self.noclrinstance = set() - -def parseExclusionList(exclusion_filename): - with open(exclusion_filename,'r') as ExclusionFile: - exclusionInfo = EventExclusions() - - for line in ExclusionFile: - line = line.strip() - - #remove comments - if not line or line.startswith('#'): - continue - - tokens = line.split(':') - #entries starting with nomac are ignored - if "nomac" in tokens: - continue - - if len(tokens) > 5: - raise Exception("Invalid Entry " + line + "in "+ exclusion_filename) - - eventProvider = tokens[2] - eventTask = tokens[1] - eventSymbol = tokens[4] - - if eventProvider == '': - eventProvider = "*" - if eventTask == '': - eventTask = "*" - if eventSymbol == '': - eventSymbol = "*" - entry = eventProvider + ":" + eventTask + ":" + eventSymbol - - if tokens[0].lower() == "nostack": - exclusionInfo.nostack.add(entry) - if tokens[0].lower() == "stack": - exclusionInfo.explicitstack.add(entry) - if tokens[0].lower() == "noclrinstanceid": - exclusionInfo.noclrinstance.add(entry) - - return exclusionInfo - def getStackWalkBit(eventProvider, taskName, eventSymbol, stackSet): for entry in stackSet: tokens = entry.split(':') if len(tokens) != 3: - raise Exception("Error, possible error in the script which introduced the enrty "+ entry) + raise Exception("Error, possible error in the script which introduced the entry "+ entry) eventCond = tokens[0] == eventProvider or tokens[0] == "*" taskCond = tokens[1] == taskName or tokens[1] == "*" @@ -164,7 +117,7 @@ def getStackWalkBit(eventProvider, taskName, eventSymbol, stackSet): return False return True -#Add the miscelaneous checks here +#Add the miscellaneous checks here def checkConsistency(manifest, exclusion_filename): tree = DOM.parse(manifest) exclusionInfo = parseExclusionList(exclusion_filename) diff --git a/src/scripts/genEventPipe.py b/src/scripts/genEventPipe.py index 59f5d711fe..f66b54ea28 100644 --- a/src/scripts/genEventPipe.py +++ b/src/scripts/genEventPipe.py @@ -3,7 +3,7 @@ from genEventing import * from genLttngProvider import * import os import xml.dom.minidom as DOM -from utilities import open_for_update +from utilities import open_for_update, parseExclusionList stdprolog_cpp = """// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. @@ -73,7 +73,7 @@ def generateMethodSignatureWrite(eventName, template, extern): return ''.join(sig_pieces) def generateClrEventPipeWriteEventsImpl( - providerName, eventNodes, allTemplates, extern): + providerName, eventNodes, allTemplates, extern, exclusionList): providerPrettyName = providerName.replace("Windows-", '') providerPrettyName = providerPrettyName.replace("Microsoft-", '') providerPrettyName = providerPrettyName.replace('-', '_') @@ -153,8 +153,14 @@ def generateClrEventPipeWriteEventsImpl( eventLevel = eventLevel.replace("win:", "EventPipeEventLevel::") taskName = eventNode.getAttribute('task') - initEvent = """ EventPipeEvent%s = EventPipeProvider%s->AddEvent(%s,%s,%s,%s); -""" % (eventName, providerPrettyName, eventValue, eventKeywordsMask, eventVersion, eventLevel) + needStack = "true" + for nostackentry in exclusionList.nostack: + tokens = nostackentry.split(':') + if tokens[2] == eventName: + needStack = "false" + + initEvent = """ EventPipeEvent%s = EventPipeProvider%s->AddEvent(%s,%s,%s,%s,%s); +""" % (eventName, providerPrettyName, eventValue, eventKeywordsMask, eventVersion, eventLevel, needStack) WriteEventImpl.append(initEvent) WriteEventImpl.append("}") @@ -384,7 +390,7 @@ bool WriteToBuffer(const char *str, char *&buffer, size_t& offset, size_t& size, helper.close() def generateEventPipeImplFiles( - etwmanifest, eventpipe_directory, extern): + etwmanifest, eventpipe_directory, extern, exclusionList): tree = DOM.parse(etwmanifest) # Find the src directory starting with the assumption that @@ -460,11 +466,12 @@ bool WriteToBuffer(const T &value, char *&buffer, size_t& offset, size_t& size, providerName, eventNodes, allTemplates, - extern) + "\n") + extern, + exclusionList) + "\n") def generateEventPipeFiles( - etwmanifest, intermediate, extern): + etwmanifest, intermediate, extern, exclusionList): eventpipe_directory = os.path.join(intermediate, eventpipe_dirname) tree = DOM.parse(etwmanifest) @@ -487,7 +494,8 @@ def generateEventPipeFiles( generateEventPipeImplFiles( etwmanifest, eventpipe_directory, - extern + extern, + exclusionList ) import argparse @@ -502,6 +510,8 @@ def main(argv): required = parser.add_argument_group('required arguments') required.add_argument('--man', type=str, required=True, help='full path to manifest containig the description of events') + required.add_argument('--exc', type=str, required=True, + help='full path to exclusion list') required.add_argument('--intermediate', type=str, required=True, help='full path to eventprovider intermediate directory') required.add_argument('--nonextern', action='store_true', @@ -512,10 +522,11 @@ def main(argv): return 1 sClrEtwAllMan = args.man + exclusion_filename = args.exc intermediate = args.intermediate extern = not args.nonextern - generateEventPipeFiles(sClrEtwAllMan, intermediate, extern) + generateEventPipeFiles(sClrEtwAllMan, intermediate, extern, parseExclusionList(exclusion_filename)) if __name__ == '__main__': return_code = main(sys.argv[1:]) diff --git a/src/scripts/utilities.py b/src/scripts/utilities.py index 7e69f462a9..c4767a43b7 100644 --- a/src/scripts/utilities.py +++ b/src/scripts/utilities.py @@ -120,3 +120,49 @@ def update_directory(srcpath, dstpath, recursive=True, destructive=True, shallow if not os.path.exists(dstdir): os.makedirs(dstdir) update_directory(srcdir, dstdir, recursive, destructive, shallow) + +class EventExclusions: + def __init__(self): + self.nostack = set() + self.explicitstack = set() + self.noclrinstance = set() + +def parseExclusionList(exclusion_filename): + with open(exclusion_filename,'r') as ExclusionFile: + exclusionInfo = EventExclusions() + + for line in ExclusionFile: + line = line.strip() + + #remove comments + if not line or line.startswith('#'): + continue + + tokens = line.split(':') + #entries starting with nomac are ignored + if "nomac" in tokens: + continue + + if len(tokens) > 5: + raise Exception("Invalid Entry " + line + "in "+ exclusion_filename) + + eventProvider = tokens[2] + eventTask = tokens[1] + eventSymbol = tokens[4] + + if eventProvider == '': + eventProvider = "*" + if eventTask == '': + eventTask = "*" + if eventSymbol == '': + eventSymbol = "*" + entry = eventProvider + ":" + eventTask + ":" + eventSymbol + + if tokens[0].lower() == "nostack": + exclusionInfo.nostack.add(entry) + if tokens[0].lower() == "stack": + exclusionInfo.explicitstack.add(entry) + if tokens[0].lower() == "noclrinstanceid": + exclusionInfo.noclrinstance.add(entry) + + return exclusionInfo
\ No newline at end of file |