private void MockFunctionData(uint startPosition, uint endPosition, string directory, string fileName) { SbBreakpointLocation location = mockBreakpoint.GetLocationAtIndex(0); SbAddress mockBreakpointAddress = Substitute.For <SbAddress>(); SbAddress mockStartAddress = Substitute.For <SbAddress>(); SbAddress mockFunctionEndAddress = Substitute.For <SbAddress>(); SbAddress mockActualEndAddress = Substitute.For <SbAddress>(); SbLineEntry mockStartLineEntry = Substitute.For <SbLineEntry>(); SbLineEntry mockEndLineEntry = Substitute.For <SbLineEntry>(); ulong address = 0x1234567; location.GetAddress().Returns(mockBreakpointAddress); mockBreakpointAddress.GetFunction().Returns(mockFunction); mockFunction.GetStartAddress().Returns(mockStartAddress); mockFunction.GetEndAddress().Returns(mockFunctionEndAddress); mockFunctionEndAddress.GetLoadAddress(mockTarget).Returns(address); mockTarget.ResolveLoadAddress(address - 1).Returns(mockActualEndAddress); mockStartAddress.GetLineEntry().Returns(mockStartLineEntry); mockActualEndAddress.GetLineEntry().Returns(mockEndLineEntry); mockStartLineEntry.GetLine().Returns(startPosition); mockStartLineEntry.GetDirectory().Returns(directory); mockStartLineEntry.GetFileName().Returns(fileName); mockEndLineEntry.GetLine().Returns(endPosition); }
public BreakpointErrorPair CreateFunctionOffsetBreakpoint(string symbolName, uint offset) { RemoteBreakpoint functionBreakpoint = BreakpointCreateByName(symbolName); if (functionBreakpoint.GetNumLocations() < 1) { return(new BreakpointErrorPair(null, BreakpointError.NoFunctionLocation)); } // At the moment if there are two functions with the same offset will be applied only // for one of them. In base VS 2017 the breakpoint is created only for one // function if there are overloaded functions. SbFunction function = functionBreakpoint.GetLocationAtIndex(0).GetAddress().GetFunction(); // Delete the breakpoint as we don't need it anymore and don't want it to linger _sbTarget.BreakpointDelete(functionBreakpoint.GetId()); if (function == null) { return(new BreakpointErrorPair(null, BreakpointError.NoFunctionFound)); } SbLineEntry startLineEntry = function.GetStartAddress().GetLineEntry(); uint startLine = startLineEntry.GetLine(); // EndAddress points to the first address after the function so we // subtract one from that address and get the corresponding lineEntry. SbAddress endAddress = function.GetEndAddress(); ulong address = endAddress.GetLoadAddress(_sbTarget); endAddress = ResolveLoadAddress(address - 1); uint endLine = endAddress.GetLineEntry().GetLine(); uint newPosition = startLine + offset + 1; if (newPosition > endLine) { return(new BreakpointErrorPair(null, BreakpointError.PositionNotAvailable)); } string fileName = startLineEntry.GetFileName(); string directory = startLineEntry.GetDirectory(); string path = Path.Combine(directory, fileName); RemoteBreakpoint breakpoint = BreakpointCreateByLocation(path, newPosition); return(new BreakpointErrorPair(breakpoint, BreakpointError.Success)); }