From ccb041d0eaed9c4fe7a27171d2fa1f6f2bde5834 Mon Sep 17 00:00:00 2001 From: Eugene Tarassov Date: Sat, 15 Feb 2014 15:43:20 -0800 Subject: Bug 428117 - Debugger does not report sources file after stopped at main --- agent/tcf/services/dwarfcache.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/agent/tcf/services/dwarfcache.c b/agent/tcf/services/dwarfcache.c index 23adbbaa..19326215 100644 --- a/agent/tcf/services/dwarfcache.c +++ b/agent/tcf/services/dwarfcache.c @@ -851,6 +851,10 @@ static int addr_ranges_comparator(const void * x, const void * y) { static void add_addr_range(ELF_Section * sec, CompUnit * unit, ContextAddress addr, ContextAddress size) { UnitAddressRange * range = NULL; + if (addr + size <= addr) { + if (size == 0) return; + size = 0 - addr; + } if (sCache->mAddrRangesCnt >= sCache->mAddrRangesMax) { sCache->mAddrRangesMax = sCache->mAddrRangesMax == 0 ? 64 : sCache->mAddrRangesMax * 2; sCache->mAddrRanges = (UnitAddressRange *)loc_realloc(sCache->mAddrRanges, sizeof(UnitAddressRange) * sCache->mAddrRangesMax); @@ -981,9 +985,18 @@ static void load_addr_ranges(void) { for (i = 0; i < sCache->mAddrRangesCnt - 1; i++) { UnitAddressRange * x = sCache->mAddrRanges + i; UnitAddressRange * y = x + 1; + ContextAddress x_end = x->mAddr + x->mSize; if (x->mSection == y->mSection && x->mUnit == y->mUnit && - x->mAddr == y->mAddr && x->mSize == y->mSize) { + (x_end == 0 || x_end >= y->mAddr)) { /* Skip duplicate entry */ + ContextAddress y_end = y->mAddr + y->mSize; + y->mAddr = x->mAddr; + if (x_end == 0 || (y_end != 0 && x_end > y_end)) { + y->mSize = x->mSize; + } + else { + y->mSize = y_end - x->mAddr; + } continue; } if (j < i) memcpy(sCache->mAddrRanges + j, x, sizeof(UnitAddressRange)); -- cgit v1.2.3