コード例 #1
0
ファイル: ElfCoreDump.cs プロジェクト: sdmaclea/SharpDebug
            /// <summary>
            /// Gets the thread stack trace.
            /// </summary>
            /// <param name="threadIndex">Index of the thread.</param>
            /// <param name="dumpFileMemoryReader">The dump file memory reader.</param>
            /// <param name="process">Process being debugged.</param>
            /// <param name="symbolProvider">The symbol provider.</param>
            /// <returns>Array of tuples of instruction offset, stack offset and frame offset.</returns>
            public Tuple <ulong, ulong, ulong>[] GetThreadStackTrace(int threadIndex, DumpFileMemoryReader dumpFileMemoryReader, Process process, DwarfSymbolProvider symbolProvider)
            {
                const int    pointerSize = 8;
                elf_prstatus prstatus    = threads[threadIndex];
                ulong        bp          = prstatus.pr_reg[X64RegisterIndex.RBP];
                ulong        ip          = prstatus.pr_reg[X64RegisterIndex.RIP];
                List <Tuple <ulong, ulong, ulong> > result = new List <Tuple <ulong, ulong, ulong> >();
                ulong segmentStartAddress, segmentSize;

                dumpFileMemoryReader.GetMemoryRange(bp, out segmentStartAddress, out segmentSize);
                while (bp >= segmentStartAddress && bp < segmentStartAddress + segmentSize)
                {
                    result.Add(Tuple.Create(ip, bp, bp));

                    ulong  savedLocationForRegisters = bp;
                    Module module = process.GetModuleByInnerAddress(ip);

                    if (module != null)
                    {
                        DwarfSymbolProviderModule symbolProviderModule = symbolProvider.GetSymbolProviderModule(module) as DwarfSymbolProviderModule;

                        if (symbolProviderModule != null)
                        {
                            ThreadContext frameContext          = new ThreadContext(ip, bp, bp, null);
                            ulong         canonicalFrameAddress = symbolProviderModule.GetFunctionCanonicalFrameAddress(process, ip, frameContext);

                            if (canonicalFrameAddress != 0)
                            {
                                savedLocationForRegisters = canonicalFrameAddress - pointerSize * 2;
                            }
                        }
                    }

                    MemoryBuffer buffer = dumpFileMemoryReader.ReadMemory(savedLocationForRegisters, pointerSize * 2);
                    bp = UserType.ReadPointer(buffer, 0, pointerSize);
                    ip = UserType.ReadPointer(buffer, pointerSize, pointerSize);
                }
                return(result.ToArray());
            }
コード例 #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DwarfCodeGenModuleProvider"/> class.
 /// </summary>
 public DwarfCodeGenModuleProvider()
 {
     symbolProvider = new DwarfSymbolProvider();
 }
コード例 #3
0
ファイル: ElfCoreDump.cs プロジェクト: sdmaclea/SharpDebug
 /// <summary>
 /// Gets the thread stack trace.
 /// </summary>
 /// <param name="threadIndex">Index of the thread.</param>
 /// <param name="process">Process being debugged.</param>
 /// <param name="symbolProvider">The symbol provider.</param>
 /// <returns>Array of tuples of instruction offset, stack offset and frame offset.</returns>
 public Tuple <ulong, ulong, ulong>[] GetThreadStackTrace(int threadIndex, Process process, DwarfSymbolProvider symbolProvider)
 {
     return(instance.GetThreadStackTrace(threadIndex, DumpFileMemoryReader, process, symbolProvider));
 }