private string GetCurrentSourceCode(CorSourcePosition source)
        {
            SourceFileReader sourceReader = new SourceFileReader(source.Path);
            StringBuilder sb = new StringBuilder();
            // Print three lines of code
            if (source.StartLine >= sourceReader.LineCount ||
                source.EndLine >= sourceReader.LineCount)
                return string.Empty;

            for (Int32 i = source.StartLine; i <= source.EndLine; i++){
                String line = sourceReader[i];
                sb.AppendLine(line);
            }
            return sb.ToString();
        }
        public CorSourcePosition GetSourcePositionFromIP(Int32 ip)
        {
            InitSymbolInformation();

            if (!p_hasSymbols)
                return null;

            if (p_SPcount > 0 && p_SPoffsets[0] <= ip)
            {
                Int32 i;
                // find a sequence point that the given instruction
                // pointer belongs to
                for (i = 0; i < p_SPcount; i++)
                {
                    if (p_SPoffsets[i] >= ip)
                        break;
                }

                // ip does not belong to any sequence point
                if (i == p_SPcount || p_SPoffsets[i] != ip)
                    i--;

                CorSourcePosition sp = null;
                if (p_SPstartLines[i] == SpecialSequencePoint)
                {
                    // special type of sequence point
                    // it indicates that the source code
                    // for this part is hidden from the debugger

                    // search backward for the last known line
                    // which is not a special sequence point
                    Int32 noSpecialSequencePointInd = i;
                    while (--noSpecialSequencePointInd >= 0)
                        if (p_SPstartLines[noSpecialSequencePointInd] != SpecialSequencePoint)
                            break;

                    if (noSpecialSequencePointInd < 0)
                    {
                        // if not found in backward search
                        // search forward for the first known line
                        // which is not a special sequence point
                        noSpecialSequencePointInd = i;
                        while (++noSpecialSequencePointInd < p_SPcount)
                            if (p_SPstartLines[noSpecialSequencePointInd] != SpecialSequencePoint)
                                break;
                    }

                    if (noSpecialSequencePointInd < p_SPcount)
                    {
                        sp = new CorSourcePosition(true,
                                                   p_SPdocuments[noSpecialSequencePointInd].URL,
                                                   p_SPstartLines[noSpecialSequencePointInd],
                                                   p_SPendLines[noSpecialSequencePointInd],
                                                   p_SPstartColumns[noSpecialSequencePointInd],
                                                   p_SPendColumns[noSpecialSequencePointInd]);
                    }
                }
                else
                {
                    sp = new CorSourcePosition(false, p_SPdocuments[i].URL, p_SPstartLines[i], p_SPendLines[i],
                                                p_SPstartColumns[i], p_SPendColumns[i]);
                }
                return sp;
            }
            return null;
        }