/// <summary>
        /// Opens the module for the specified XML module description.
        /// </summary>
        /// <param name="xmlModule">The XML module description.</param>
        public SharpDebug.CodeGen.SymbolProviders.Module Open(XmlModule xmlModule)
        {
            Module module = new Module(default(Process), 0)
            {
                Name            = xmlModule.Name,
                SymbolFileName  = xmlModule.SymbolsPath,
                MappedImageName = xmlModule.SymbolsPath,
                ImageName       = xmlModule.SymbolsPath,
            };
            var result = new EngineSymbolProviderModule(module, xmlModule, symbolProvider);
            DwarfSymbolProviderModule provider = (DwarfSymbolProviderModule)result.EngineModuleProvider;

            module.PointerSize = provider.Is64bit ? 8U : 4U;
            return(result);
        }
Example #2
0
            /// <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());
            }