示例#1
0
        public SourceInfos GetSourceInfos(UInt32 aAddress)
        {
            var xResult = new SourceInfos();

            try
            {
                var xMethod = GetMethod(aAddress);
                if (xMethod != null)
                {
                    var xSymbols      = GetSymbols(xMethod);
                    var xAssemblyFile = mConnection.Get <AssemblyFile>(xMethod.AssemblyFileID);
                    var xSymbolReader = SymbolAccess.GetReaderForFile(xAssemblyFile.Pathname);
                    var xMethodSymbol = xSymbolReader.GetMethod(new SymbolToken(xMethod.MethodToken));

                    int xSeqCount       = xMethodSymbol.SequencePointCount;
                    var xCodeOffsets    = new int[xSeqCount];
                    var xCodeDocuments  = new ISymbolDocument[xSeqCount];
                    var xCodeLines      = new int[xSeqCount];
                    var xCodeColumns    = new int[xSeqCount];
                    var xCodeEndLines   = new int[xSeqCount];
                    var xCodeEndColumns = new int[xSeqCount];
                    xMethodSymbol.GetSequencePoints(xCodeOffsets, xCodeDocuments, xCodeLines, xCodeColumns, xCodeEndLines, xCodeEndColumns);
                    if (xSymbols.Length == 0 && xSeqCount > 0)
                    {
                        var xSourceInfo = new SourceInfo()
                        {
                            SourceFile = xCodeDocuments[0].URL,
                            Line       = xCodeLines[0],
                            LineEnd    = xCodeEndLines[0],
                            Column     = xCodeColumns[0],
                            ColumnEnd  = xCodeEndColumns[0],
                            MethodName = xMethod.LabelCall
                        };
                        xResult.Add(aAddress, xSourceInfo);
                    }
                    else
                    {
                        foreach (var xSymbol in xSymbols)
                        {
                            var xRow = mConnection.Query <Label>(new SQLinq <Label>().Where(i => i.Name == xSymbol.LabelName)).FirstOrDefault();
                            if (xRow != null)
                            {
                                UInt32 xAddress = (UInt32)xRow.Address;
                                // Each address could have mult labels, but this wont matter for SourceInfo, its not tied to label.
                                // So we just ignore duplicate addresses.
                                if (!xResult.ContainsKey(xAddress))
                                {
                                    int xIdx        = SourceInfo.GetIndexClosestSmallerMatch(xCodeOffsets, xSymbol.IlOffset);
                                    var xSourceInfo = new SourceInfo()
                                    {
                                        SourceFile = xCodeDocuments[xIdx].URL,
                                        Line       = xCodeLines[xIdx],
                                        LineEnd    = xCodeEndLines[xIdx],
                                        Column     = xCodeColumns[xIdx],
                                        ColumnEnd  = xCodeEndColumns[xIdx],
                                        MethodName = xMethod.LabelCall
                                    };
                                    xResult.Add(xAddress, xSourceInfo);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
            }
            return(xResult);
        }
示例#2
0
        private SourceInfos DoGetSourceInfos(uint aAddress)
        {
            var xResult = new SourceInfos();

            try
            {
                var xMethod = GetMethod(aAddress);

                if (xMethod != null)
                {
                    var xSymbols      = GetSymbols(xMethod);
                    var xAssemblyFile = mConnection.Get <AssemblyFile>(xMethod.AssemblyFileID);

                    var xSeqPoints = GetSequencePoints(xAssemblyFile.Pathname, xMethod.MethodToken).ToList();
                    int xSeqCount  = xSeqPoints.Count;

                    var xCodeOffsets      = new int[xSeqCount];
                    var xCodeDocuments    = new string[xSeqCount];
                    var xCodeStartLines   = new int[xSeqCount];
                    var xCodeStartColumns = new int[xSeqCount];
                    var xCodeEndLines     = new int[xSeqCount];
                    var xCodeEndColumns   = new int[xSeqCount];

                    for (int i = 0; i < xSeqPoints.Count; i++)
                    {
                        xCodeOffsets[i]      = xSeqPoints[i].Offset;
                        xCodeDocuments[i]    = xSeqPoints[i].Document;
                        xCodeStartLines[i]   = xSeqPoints[i].LineStart;
                        xCodeStartColumns[i] = xSeqPoints[i].ColStart;
                        xCodeEndLines[i]     = xSeqPoints[i].LineEnd;
                        xCodeEndColumns[i]   = xSeqPoints[i].ColEnd;
                    }

                    if (xSymbols.Length == 0 && xSeqCount > 0)
                    {
                        var xSourceInfo = new SourceInfo()
                        {
                            SourceFile  = xCodeDocuments[0],
                            LineStart   = xCodeStartLines[0],
                            LineEnd     = xCodeEndLines[0],
                            ColumnStart = xCodeStartColumns[0],
                            ColumnEnd   = xCodeEndColumns[0],
                            MethodName  = xMethod.LabelCall
                        };

                        xResult.Add(aAddress, xSourceInfo);
                    }
                    else
                    {
                        foreach (var xSymbol in xSymbols)
                        {
                            var xRow = mConnection.GetList <Label>(Predicates.Field <Label>(q => q.Name, Operator.Eq, xSymbol.LabelName)).FirstOrDefault();

                            if (xRow != null)
                            {
                                uint xAddress = (uint)xRow.Address;
                                // Each address could have mult labels, but this wont matter for SourceInfo, its not tied to label.
                                // So we just ignore duplicate addresses.
                                if (!xResult.ContainsKey(xAddress))
                                {
                                    int xIdx        = SourceInfo.GetIndexClosestSmallerMatch(xCodeOffsets, xSymbol.IlOffset);
                                    var xSourceInfo = new SourceInfo()
                                    {
                                        SourceFile  = xCodeDocuments[xIdx],
                                        LineStart   = xCodeStartLines[xIdx],
                                        LineEnd     = xCodeEndLines[xIdx],
                                        ColumnStart = xCodeStartColumns[xIdx],
                                        ColumnEnd   = xCodeEndColumns[xIdx],
                                        MethodName  = xMethod.LabelCall
                                    };
                                    xResult.Add(xAddress, xSourceInfo);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
            }
            return(xResult);
        }