Skip to content

Commit

Permalink
Correctly mark top call stack frame
Browse files Browse the repository at this point in the history
  • Loading branch information
WheretIB committed May 23, 2020
1 parent 3f181b7 commit 251dfdc
Showing 1 changed file with 27 additions and 3 deletions.
30 changes: 27 additions & 3 deletions LuaDkmDebuggerComponent/LocalComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -235,12 +235,17 @@ DkmStackWalkFrame[] IDkmCallStackFilter.FilterNextFrame(DkmStackContext stackCon

LoadConfigurationFile(process, processData);

bool isTopFrame = (input.Flags & DkmStackWalkFrameFlags.TopFrame) != 0;

List<DkmStackWalkFrame> luaFrames = new List<DkmStackWalkFrame>();

var luaFrameFlags = input.Flags;

luaFrameFlags = luaFrameFlags & ~(DkmStackWalkFrameFlags.NonuserCode | DkmStackWalkFrameFlags.UserStatusNotDetermined);
luaFrameFlags = luaFrameFlags | DkmStackWalkFrameFlags.InlineOptimized;
luaFrameFlags &= ~(DkmStackWalkFrameFlags.NonuserCode | DkmStackWalkFrameFlags.UserStatusNotDetermined);
luaFrameFlags |= DkmStackWalkFrameFlags.InlineOptimized;

if (isTopFrame)
luaFrameFlags |= DkmStackWalkFrameFlags.TopFrame;

ulong? stateAddress = TryEvaluateAddressExpression($"L", stackContext, input);

Expand Down Expand Up @@ -434,6 +439,8 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
if (frame != null)
{
luaFrames.Add(frame);

luaFrameFlags &= ~DkmStackWalkFrameFlags.TopFrame;
}
}
else
Expand All @@ -446,6 +453,8 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
}

luaFrames.Add(DkmStackWalkFrame.Create(stackContext.Thread, input.InstructionAddress, input.FrameBase, input.FrameSize, luaFrameFlags, $"[{currFunctionName} C function]", input.Registers, input.Annotations));

luaFrameFlags &= ~DkmStackWalkFrameFlags.TopFrame;
}

currCallInfoAddress = currCallInfoAddress - (DebugHelpers.Is64Bit(process) ? 40ul : 24ul);
Expand Down Expand Up @@ -482,6 +491,8 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
{
luaFrames.Add(DkmStackWalkFrame.Create(stackContext.Thread, input.InstructionAddress, input.FrameBase, input.FrameSize, luaFrameFlags, $"__gc", input.Registers, input.Annotations));

luaFrameFlags &= ~DkmStackWalkFrameFlags.TopFrame;

currCallInfoAddress = currCallInfoData.previousAddress;
continue;
}
Expand All @@ -491,6 +502,8 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
{
luaFrames.Add(DkmStackWalkFrame.Create(stackContext.Thread, input.InstructionAddress, input.FrameBase, input.FrameSize, luaFrameFlags, $"[name unavailable - tail call]", input.Registers, input.Annotations));

luaFrameFlags &= ~DkmStackWalkFrameFlags.TopFrame;

currCallInfoAddress = currCallInfoData.previousAddress;
continue;
}
Expand Down Expand Up @@ -540,6 +553,8 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
if (frame != null)
{
luaFrames.Add(frame);

luaFrameFlags &= ~DkmStackWalkFrameFlags.TopFrame;
}
}
else if (currCallInfoData.func.extendedType == LuaExtendedType.ExternalFunction)
Expand All @@ -552,6 +567,8 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
}

luaFrames.Add(DkmStackWalkFrame.Create(stackContext.Thread, input.InstructionAddress, input.FrameBase, input.FrameSize, luaFrameFlags, $"[{currFunctionName} C function]", input.Registers, input.Annotations));

luaFrameFlags &= ~DkmStackWalkFrameFlags.TopFrame;
}
else if (currCallInfoData.func.extendedType == LuaExtendedType.ExternalClosure)
{
Expand All @@ -563,6 +580,8 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
}

luaFrames.Add(DkmStackWalkFrame.Create(stackContext.Thread, input.InstructionAddress, input.FrameBase, input.FrameSize, luaFrameFlags, $"[{currFunctionName} C closure]", input.Registers, input.Annotations));

luaFrameFlags &= ~DkmStackWalkFrameFlags.TopFrame;
}

currCallInfoAddress = currCallInfoData.previousAddress;
Expand All @@ -574,7 +593,12 @@ DkmStackWalkFrame GetLuaFunctionStackWalkFrame(ulong callInfoAddress, LuaFunctio
}
}

luaFrames.Add(DkmStackWalkFrame.Create(stackContext.Thread, input.InstructionAddress, input.FrameBase, input.FrameSize, (input.Flags & ~DkmStackWalkFrameFlags.UserStatusNotDetermined) | DkmStackWalkFrameFlags.NonuserCode, input.Description, input.Registers, input.Annotations));
var originalFlags = (input.Flags & ~DkmStackWalkFrameFlags.UserStatusNotDetermined) | DkmStackWalkFrameFlags.NonuserCode;

if (luaFrames.Count != 0 && isTopFrame)
originalFlags &= ~DkmStackWalkFrameFlags.TopFrame;

luaFrames.Add(DkmStackWalkFrame.Create(stackContext.Thread, input.InstructionAddress, input.FrameBase, input.FrameSize, originalFlags, input.Description, input.Registers, input.Annotations));

return luaFrames.ToArray();
}
Expand Down

0 comments on commit 251dfdc

Please sign in to comment.