/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.utils.debug.tools;
import java.io.IOException;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.utils.debug.dwarf.Dwarf;
import org.eclipse.cdt.utils.debug.stabs.Stabs;
import org.eclipse.cdt.utils.elf.Elf;
/**
* StabsAddr2ine
*
* @author alain
*/
public class DebugAddr2line {
DebugSymsRequestor symreq;
public DebugAddr2line(String file) throws IOException {
Elf elf = new Elf(file);
init(elf);
elf.dispose();
}
public DebugAddr2line(Elf elf) throws IOException {
init(elf);
}
void init(Elf elf) throws IOException {
symreq = new DebugSymsRequestor();
Elf.Attribute attribute = elf.getAttributes();
int type = attribute.getDebugType();
if (type == Elf.Attribute.DEBUG_TYPE_STABS) {
Stabs stabs = new Stabs(elf);
stabs.parse(symreq);
} else if (type == Elf.Attribute.DEBUG_TYPE_DWARF) {
Dwarf dwarf = new Dwarf(elf);
dwarf.parse(symreq);
} else {
throw new IOException(CCorePlugin.getResourceString("Util.unknownFormat")); //$NON-NLS-1$
}
}
/*
* (non-Javadoc)
*
* @see IAddr2line#dispose()
*/
public void dispose() {
}
/*
* (non-Javadoc)
*
* @see IAddr2line#getStartLine(long)
*/
public int getStartLine(long address) throws IOException {
DebugSym entry = symreq.getEntry(address);
if (entry != null) {
return entry.startLine;
}
return 0;
}
/*
* (non-Javadoc)
*
* @see IAddr2line#getEndLine(long)
*/
public int getEndLine(long address) throws IOException {
DebugSym entry = symreq.getEntry(address);
if (entry != null) {
return entry.endLine;
}
return 0;
}
/*
* (non-Javadoc)
*
* @see IAddr2line#getFunction(long)
*/
public String getFunction(long address) throws IOException {
DebugSym entry = symreq.getEntry(address);
if (entry != null) {
return entry.name;
}
return null;
}
/*
* (non-Javadoc)
*
* @see IAddr2line#getFileName(long)
*/
public String getFileName(long address) throws IOException {
DebugSym entry = symreq.getEntry(address);
if (entry != null) {
return entry.filename;
}
return null;
}
public static void main(String[] args) {
try {
DebugAddr2line addr2line = new DebugAddr2line(args[0]);
long address = Integer.decode(args[1]).longValue();
int startLine = addr2line.getStartLine(address);
int endLine = addr2line.getEndLine(address);
String function = addr2line.getFunction(address);
String filename = addr2line.getFileName(address);
System.out.println(Long.toHexString(address));
System.out.println(filename + ":" + function + ":" + startLine + ":" + endLine); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} catch (IOException e) {
e.printStackTrace();
}
}
}