summaryrefslogtreecommitdiff
path: root/src/scripts
diff options
context:
space:
mode:
authorAndrew Au <andrewau@microsoft.com>2019-03-18 15:19:45 -0700
committerAndrew Au <cshung@gmail.com>2019-03-21 17:11:06 -0400
commita7c9ca110096c27de23f045cd176c2109d0676d9 (patch)
tree45dd6a3064babadad30f4746b7ab9864f6a00055 /src/scripts
parentceca0a77e8b48e30f9c6b67d2992c3276aba2177 (diff)
downloadcoreclr-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.py53
-rw-r--r--src/scripts/genEventPipe.py29
-rw-r--r--src/scripts/utilities.py46
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