diff --git a/dlangide.visualdproj b/dlangide.visualdproj index facf860..2277468 100644 --- a/dlangide.visualdproj +++ b/dlangide.visualdproj @@ -64,7 +64,7 @@ 1 $(IntDir)\$(TargetName).json 0 - + DebugInfo 0 Unicode USE_FREETYPE 0 diff --git a/src/ddebug/windows/debuginfo.d b/src/ddebug/windows/debuginfo.d index ccf6113..0120751 100644 --- a/src/ddebug/windows/debuginfo.d +++ b/src/ddebug/windows/debuginfo.d @@ -1,5 +1,6 @@ module ddebug.windows.debuginfo; +version(Windows): import dlangui.core.logger; import std.file; import std.algorithm; @@ -49,13 +50,47 @@ struct Buffer { ubyte[] sectionAt(uint pos) { uint rva = uintAt(pos); uint sz = uintAt(pos + 4); + Log.d("section rva=", rva, " sz=", sz); + if (!sz) + return null; enforce(pos + sz <= buf.length, new FileFormatException("sectionAt: index is outside file range")); return buf[rva .. rva + sz]; } + string stringzAt(uint pos, uint maxSize) { + char[] res; + for (uint p = pos; maxSize == 0 || p < pos + maxSize; p++) { + ubyte ch = ubyteAt(p); + if (!ch) + break; + res ~= ch; + } + return cast(string)res; + } + ubyte[] rangeAt(uint pos, uint size) { + Log.d("rangeAt: pos=", pos, " size=", size, " pos+size=", pos+size, " buf.len=", buf.length); + uint endp = pos + size; + //if (endp > buf.length) + // endp = cast(uint)buf.length; + enforce(pos <= endp, new FileFormatException("rangeAt: index is outside file range")); + return buf[pos .. endp]; + } } struct Section { - + string name; + uint vsize; + uint rva; + uint sz; + uint offset; + uint flags; + this(ref Buffer buf, uint pos) { + name = buf.stringzAt(pos, 8); + vsize = buf.uintAt(pos + 0x08); + rva = buf.uintAt(pos + 0x0C); + sz = buf.uintAt(pos + 0x10); + offset = buf.uintAt(pos + 0x14); + flags = buf.uintAt(pos + 0x28); + } } class OMFDebugInfo { @@ -66,11 +101,40 @@ class OMFDebugInfo { data.buf = cast(ubyte[])std.file.read(filename); data.check(0, ['M', 'Z']); peoffset = data.uintAt(0x3c); - data.skip(peoffset); - data.check(0, ['P', 'E', 0, 0]); - ushort objectCount = data.ushortAt(0x06); - ushort flags = data.ushortAt(0x16); - ushort subsystem = data.ushortAt(0x5c); + Buffer pe; + pe.buf = data.buf[peoffset .. $]; + //data.skip(peoffset); + pe.check(0, ['P', 'E', 0, 0]); + ushort objectCount = pe.ushortAt(0x06); + ushort flags = pe.ushortAt(0x16); + ushort subsystem = pe.ushortAt(0x5c); + uint coffRva = pe.uintAt(0x0c); + uint coffSize = pe.uintAt(0x10); + Log.d("subsystem: ", subsystem, " flags: ", flags, " coffRva:", coffRva, " coffSize:", coffSize); + //ubyte[] debugInfo = data.sectionAt(peoffset + 0xA8); + //ubyte[] exportInfo = data.sectionAt(peoffset + 0x78); + //ubyte[] importInfo = data.sectionAt(peoffset + 0x7c); + //ubyte[] resInfo = data.sectionAt(peoffset + 0x88); + //Buffer debugHeader; + //debugHeader.buf = debugInfo; + //uint debugType = debugHeader.uintAt(0x0C); + //uint debugSize = debugHeader.uintAt(0x10); + //uint debugRva = debugHeader.uintAt(0x14); + //uint debugSeek = debugHeader.uintAt(0x18); + //Log.d("debugInfo[", debugInfo.length, "] type=", debugType, " debugSize=", debugSize, " rva=", debugRva, " seek=", debugSeek, " seek-rva="); + //ubyte[] debugRaw = data.rangeAt(debugSeek, debugSize); + //Log.d("debugRaw: ", debugRaw); + ubyte[] debugData; + for (int i = 0; i < objectCount; i++) { + Section section = Section(data, peoffset + 0xF8 + i * 0x28); + Log.d("section ", section.name, " rva=", section.rva, " sz=", section.sz, " offset=", section.offset); + if (section.name.equal(".debug")) + debugData = data.rangeAt(section.offset, section.sz); + } + if (debugData) { + string debugName = cast(string)debugData[1.. debugData[0] + 1]; + Log.d("Found debug data: name=", debugName, " sz=", debugData.length); + } return true; } catch (Exception e) { throw new FileFormatException(e); diff --git a/src/dlangide.d b/src/dlangide.d index 465e438..df69098 100644 --- a/src/dlangide.d +++ b/src/dlangide.d @@ -43,9 +43,11 @@ extern (C) int UIAppMain(string[] args) { //import ddc.lexer.tokenizer; //runTokenizerTest(); debug(DebugInfo) { - import ddebug.windows.debuginfo; - import std.file; - debugInfoTest(thisExePath); + version(Windows) { + import ddebug.windows.debuginfo; + import std.file; + debugInfoTest(thisExePath); + } } // create window