Skip to content

Commit 71a01eb

Browse files
Ensure input is XML decoded (#104)
1 parent b6821ef commit 71a01eb

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

Engine/StackResolver.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ private string ResolveSymbols(Dictionary<string, DiaUtil> _diautils, Dictionary<
7676
int runningFrameNum = int.MinValue;
7777
foreach (var iterFrame in callStackLines) {
7878
if (cts.IsCancellationRequested) { StatusMessage = OperationCanceled; PercentComplete = 0; return OperationCanceled; }
79-
// hard-coded find-replace for XML markup - useful when importing from XML histograms
80-
var currentFrame = iterFrame.Replace("&lt;", "<").Replace("&gt;", ">");
79+
var currentFrame = iterFrame;
8180
if (relookupSource && includeSourceInfo) {
8281
// This is a rare case. Sometimes we get frames which are already resolved to their symbols but do not include source and line number information
8382
// take for example sqldk.dll!SpinlockBase::Sleep+0x2d0
@@ -428,6 +427,8 @@ public async Task<string> ResolveCallstacksAsync(List<StackDetails> listOfCallSt
428427
/// <returns>List of StackDetails objects</returns>
429428
public async Task<List<StackDetails>> GetListofCallStacksAsync(string inputCallstackText, bool framesOnSingleLine, CancellationTokenSource cts) {
430429
return await Task.Run(() => {
430+
this.StatusMessage = "Decoding any encoded XML input...";
431+
inputCallstackText = System.Net.WebUtility.HtmlDecode(inputCallstackText);
431432
this.StatusMessage = "Analyzing input...";
432433
if (Regex.IsMatch(inputCallstackText, @"<HistogramTarget(\s+|\>)") && inputCallstackText.Contains(@"</HistogramTarget>")) {
433434
var numHistogramTargets = Regex.Matches(inputCallstackText, @"\<\/HistogramTarget\>").Count;

Tests/Tests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,9 @@ private string PrepareLargeXEventInput() {
640640
var ret = await csr.ResolveCallstacksAsync(await csr.GetListofCallStacksAsync(input, true, cts), pdbPath, false, null, true, false, false, true, false, false, null, cts);
641641
var expected = "Slot_0 [count:5]:\r\n\r\nsqldk!XeSosPkg::spinlock_backoff::Publish+425\r\nsqldk!SpinlockBase::Sleep+182\r\nsqlmin!Spinlock<143,7,1>::SpinToAcquireWithExponentialBackoff+363\r\nsqlmin!lck_lockInternal+2042";
642642
Assert.AreEqual(expected.Trim(), ret.Trim());
643+
input = "&lt;HistogramTarget truncated=\"0\" buckets=\"256\"&gt;&lt;Slot count=\"5\"&gt;&lt;value&gt;0x00007FFEABD0D919 0x00007FFEABC4D45D 0x00007FFEAC0F7EE0 0x00007FFEAC0F80CF &lt;/value&gt;&lt;/Slot&gt;&lt;/HistogramTarget&gt;";
644+
ret = await csr.ResolveCallstacksAsync(await csr.GetListofCallStacksAsync(input, true, cts), pdbPath, false, null, true, false, false, true, false, false, null, cts);
645+
Assert.AreEqual(expected.Trim(), ret.Trim());
643646
}
644647

645648
[TestMethod][TestCategory("Unit")] public async Task E2ESymSrvXMLFramesMultiHistogram() {

0 commit comments

Comments
 (0)