A Java library to read dwarf
It is a java version of libdwarf, if you want to read out information from dwarf. please use it.
Usage :
final Vector<Dwarf> dwarfVector = DwarfLib.init(file, meoryOffset);
All dwarf information will be in dwarfVector
To add a JPanel to display dwarf information :
PeterDwarfPanel peterDwarfPanel1 = new PeterDwarfPanel();
File file = new File("/Users/peter/workspace/PeterI/kernel/kernel");
peterDwarfPanel1.init(file.getAbsolutePath());
Then just add peterDwarfPanel1 to any swing container.
contact : mcheung63@hotmail.com, my name is Peter
full example:
package com.peterdwarf;
import java.io.File;
import java.util.Enumeration;
import java.util.Vector;
import com.peterdwarf.dwarf.CompileUnit;
import com.peterdwarf.dwarf.DebugInfoAbbrevEntry;
import com.peterdwarf.dwarf.DebugInfoEntry;
import com.peterdwarf.dwarf.Dwarf;
import com.peterdwarf.dwarf.DwarfDebugLineHeader;
import com.peterdwarf.dwarf.DwarfHeaderFilename;
import com.peterdwarf.dwarf.DwarfLib;
import com.peterdwarf.dwarf.DwarfLine;
public class TestPeterDwarf {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("java -jar peter-dwarf.jar <your elf file path>");
System.exit(6);
}
for (String str : args) {
if (str.contains("-debug")) {
DwarfGlobal.debug = true;
}
}
Dwarf dwarf = new Dwarf();
File file = new File(args[0]);
if (file.isDirectory()) {
return;
}
Vector<Dwarf> dwarfLib = DwarfLib.init(file, 0);
if (dwarfLib == null) {
System.err.println("dwarf init fail");
//$hide>>$
System.exit(1);
//$hide<<$
} else if (DwarfGlobal.debug) {
System.out.println(".debug_info:");
for (CompileUnit compileUnit : dwarf.compileUnits) {
System.out.printf("Compilation Unit @ offset 0x%x\n", compileUnit.offset);
System.out.printf("Length: 0x%x\n", compileUnit.length);
System.out.println("Version: " + compileUnit.version);
System.out.printf("Abbrev Offset: 0x%x\n", compileUnit.offset);
System.out.println("Pointer Size: " + compileUnit.addr_size);
for (DebugInfoEntry debugInfoEntry : compileUnit.debugInfoEntries) {
System.out.println("<" + debugInfoEntry.position + "> Abbrev Number: " + debugInfoEntry.abbrevNo + " (" + debugInfoEntry.name + ")");
Enumeration<String> e = debugInfoEntry.debugInfoAbbrevEntries.keys();
while (e.hasMoreElements()) {
String key = e.nextElement();
DebugInfoAbbrevEntry debugInfoAbbrevEntry = debugInfoEntry.debugInfoAbbrevEntries.get(key);
if (debugInfoAbbrevEntry.value == null) {
System.out.printf("<%x>\t%s\tnull\n", debugInfoAbbrevEntry.position, debugInfoAbbrevEntry.name);
} else if (debugInfoAbbrevEntry.value instanceof String) {
System.out.printf("<%x>\t%s\t%s\n", debugInfoAbbrevEntry.position, debugInfoAbbrevEntry.name, debugInfoAbbrevEntry.value);
} else if (debugInfoAbbrevEntry.value instanceof Byte || debugInfoAbbrevEntry.value instanceof Integer || debugInfoAbbrevEntry.value instanceof Long) {
System.out.printf("<%x>\t%s\t%x\n", debugInfoAbbrevEntry.position, debugInfoAbbrevEntry.name, debugInfoAbbrevEntry.value);
} else if (debugInfoAbbrevEntry.value instanceof byte[]) {
byte[] bytes = (byte[]) debugInfoAbbrevEntry.value;
System.out.printf("<%x>\t%s\t", debugInfoAbbrevEntry.position, debugInfoAbbrevEntry.name);
for (byte b : bytes) {
System.out.printf("%x ", b);
}
System.out.println();
} else {
System.out.println("not support value format : " + debugInfoAbbrevEntry.value.getClass().toString());
}
}
}
}
System.out.println();
for (DwarfDebugLineHeader header : dwarf.headers) {
System.out.println();
System.out.println(header);
System.out.println();
System.out.println("dirnames:");
for (String s : header.dirnames) {
System.out.println(s);
}
System.out.println();
System.out.println("entry\tdir\ttime\tlen\tfilename");
for (DwarfHeaderFilename filename : header.filenames) {
System.out.println(filename.entryNo + "\t" + filename.dir + "\t" + filename.time + "\t" + filename.len + "\t" + filename.file.getAbsolutePath());
}
System.out.println();
System.out.println("address\tfile no.\tline no.\tcolumn no.\taddress");
for (DwarfLine line : header.lines) {
System.out.println("\t" + line.file_num + "\t\t" + line.line_num + "\t\t" + line.column_num + "\t\t" + line.address.toString(16));
}
System.out.println();
System.out.println();
}
}
// DwarfLib.printMappedByteBuffer(dwarf.byteBuffer);
// dwarf.printHeader();
}
}