This commit is contained in:
Dmitry Samersoff 2014-02-12 22:16:39 +00:00
commit 804e3ed06d
3 changed files with 91 additions and 92 deletions

View File

@ -29,51 +29,48 @@
#include <thread_db.h> #include <thread_db.h>
#include "libproc_impl.h" #include "libproc_impl.h"
static const char* alt_root = NULL;
static int alt_root_len = -1;
#define SA_ALTROOT "SA_ALTROOT" #define SA_ALTROOT "SA_ALTROOT"
static void init_alt_root() {
if (alt_root_len == -1) {
alt_root = getenv(SA_ALTROOT);
if (alt_root) {
alt_root_len = strlen(alt_root);
} else {
alt_root_len = 0;
}
}
}
int pathmap_open(const char* name) { int pathmap_open(const char* name) {
static const char *alt_root = NULL;
static int alt_root_initialized = 0;
int fd; int fd;
char alt_path[PATH_MAX + 1]; char alt_path[PATH_MAX + 1], *alt_path_end;
const char *s;
init_alt_root(); if (!alt_root_initialized) {
alt_root_initialized = -1;
alt_root = getenv(SA_ALTROOT);
}
if (alt_root == NULL) {
return open(name, O_RDONLY);
}
if (alt_root_len > 0) {
strcpy(alt_path, alt_root); strcpy(alt_path, alt_root);
strcat(alt_path, name); alt_path_end = alt_path + strlen(alt_path);
// Strip path items one by one and try to open file with alt_root prepended
s = name;
while (1) {
strcat(alt_path, s);
s += 1;
fd = open(alt_path, O_RDONLY); fd = open(alt_path, O_RDONLY);
if (fd >= 0) { if (fd >= 0) {
print_debug("path %s substituted for %s\n", alt_path, name); print_debug("path %s substituted for %s\n", alt_path, name);
return fd; return fd;
} }
if (strrchr(name, '/')) { // Linker always put full path to solib to process, so we can rely
strcpy(alt_path, alt_root); // on presence of /. If slash is not present, it means, that SOlib doesn't
strcat(alt_path, strrchr(name, '/')); // physically exist (e.g. linux-gate.so) and we fail opening it anyway
fd = open(alt_path, O_RDONLY); if ((s = strchr(s, '/')) == NULL) {
if (fd >= 0) { break;
print_debug("path %s substituted for %s\n", alt_path, name);
return fd;
}
}
} else {
fd = open(name, O_RDONLY);
if (fd >= 0) {
return fd;
} }
*alt_path_end = 0;
} }
return -1; return -1;

View File

@ -55,31 +55,21 @@ class LinuxCDebugger implements CDebugger {
if (pc == null) { if (pc == null) {
return null; return null;
} }
List objs = getLoadObjectList();
Object[] arr = objs.toArray();
// load objects are sorted by base address, do binary search
int mid = -1;
int low = 0;
int high = arr.length - 1;
while (low <= high) { /* Typically we have about ten loaded objects here. So no reason to do
mid = (low + high) >> 1; sort/binary search here. Linear search gives us acceptable performance.*/
LoadObject midVal = (LoadObject) arr[mid];
long cmp = pc.minus(midVal.getBase()); List objs = getLoadObjectList();
if (cmp < 0) {
high = mid - 1; for (int i = 0; i < objs.size(); i++) {
} else if (cmp > 0) { LoadObject ob = (LoadObject) objs.get(i);
long size = midVal.getSize(); Address base = ob.getBase();
if (cmp >= size) { long size = ob.getSize();
low = mid + 1; if ( pc.greaterThanOrEqual(base) && pc.lessThan(base.addOffsetTo(size))) {
} else { return ob;
return (LoadObject) arr[mid];
}
} else { // match found
return (LoadObject) arr[mid];
} }
} }
// no match found.
return null; return null;
} }

View File

@ -371,20 +371,24 @@ function sym2addr(dso, sym) {
return sa.dbg.lookup(dso, sym); return sa.dbg.lookup(dso, sym);
} }
// returns the ClosestSymbol or null function loadObjectContainingPC(addr) {
function closestSymbolFor(addr) {
if (sa.cdbg == null) { if (sa.cdbg == null) {
// no CDebugger support, return null // no CDebugger support, return null
return null; return null;
} else { }
var dso = sa.cdbg.loadObjectContainingPC(addr);
return sa.cdbg.loadObjectContainingPC(addr);
}
// returns the ClosestSymbol or null
function closestSymbolFor(addr) {
var dso = loadObjectContainingPC(addr);
if (dso != null) { if (dso != null) {
return dso.closestSymbolToPC(addr); return dso.closestSymbolToPC(addr);
} else { }
return null; return null;
} }
}
}
// Address-to-symbol // Address-to-symbol
// returns nearest symbol as string if found // returns nearest symbol as string if found
@ -886,19 +890,27 @@ function isOop(addr) {
function whatis(addr) { function whatis(addr) {
addr = any2addr(addr); addr = any2addr(addr);
var ptrLoc = findPtr(addr); var ptrLoc = findPtr(addr);
if (ptrLoc.isUnknown()) { if (!ptrLoc.isUnknown()) {
return ptrLoc.toString();
}
var vmType = vmTypeof(addr); var vmType = vmTypeof(addr);
if (vmType != null) { if (vmType != null) {
return "pointer to " + vmType.name; return "pointer to " + vmType.name;
} else { }
var sym = closestSymbolFor(addr);
var dso = loadObjectContainingPC(addr);
if (dso == null) {
return ptrLoc.toString();
}
var sym = dso.closestSymbolToPC(addr);
if (sym != null) { if (sym != null) {
return sym.name + '+' + sym.offset; return sym.name + '+' + sym.offset;
} else {
return ptrLoc.toString();
}
}
} else {
return ptrLoc.toString();
} }
var s = dso.getName();
var p = s.lastIndexOf("/");
var base = dso.getBase();
return s.substring(p+1, s.length) + '+' + addr.minus(base);
} }