dbghelp: Grow all arrays by doubling the size.
This commit is contained in:
parent
73d9ffbdb4
commit
75792a3e69
|
@ -108,12 +108,18 @@ static int coff_add_file(struct CoffFileSet* coff_files, struct module* module,
|
||||||
|
|
||||||
if (coff_files->nfiles + 1 >= coff_files->nfiles_alloc)
|
if (coff_files->nfiles + 1 >= coff_files->nfiles_alloc)
|
||||||
{
|
{
|
||||||
coff_files->nfiles_alloc += 10;
|
if (coff_files->files)
|
||||||
coff_files->files = (coff_files->files) ?
|
{
|
||||||
HeapReAlloc(GetProcessHeap(), 0, coff_files->files,
|
coff_files->nfiles_alloc *= 2;
|
||||||
coff_files->nfiles_alloc * sizeof(struct CoffFile)) :
|
coff_files->files = HeapReAlloc(GetProcessHeap(), 0, coff_files->files,
|
||||||
HeapAlloc(GetProcessHeap(), 0,
|
coff_files->nfiles_alloc * sizeof(struct CoffFile));
|
||||||
coff_files->nfiles_alloc * sizeof(struct CoffFile));
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
coff_files->nfiles_alloc = 16;
|
||||||
|
coff_files->files = HeapAlloc(GetProcessHeap(), 0,
|
||||||
|
coff_files->nfiles_alloc * sizeof(struct CoffFile));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
file = coff_files->files + coff_files->nfiles;
|
file = coff_files->files + coff_files->nfiles;
|
||||||
file->startaddr = 0xffffffff;
|
file->startaddr = 0xffffffff;
|
||||||
|
@ -132,7 +138,7 @@ static void coff_add_symbol(struct CoffFile* coff_file, struct symt* sym)
|
||||||
{
|
{
|
||||||
if (coff_file->neps + 1 >= coff_file->neps_alloc)
|
if (coff_file->neps + 1 >= coff_file->neps_alloc)
|
||||||
{
|
{
|
||||||
coff_file->neps_alloc += 10;
|
coff_file->neps_alloc *= 2;
|
||||||
coff_file->entries = (coff_file->entries) ?
|
coff_file->entries = (coff_file->entries) ?
|
||||||
HeapReAlloc(GetProcessHeap(), 0, coff_file->entries,
|
HeapReAlloc(GetProcessHeap(), 0, coff_file->entries,
|
||||||
coff_file->neps_alloc * sizeof(struct symt*)) :
|
coff_file->neps_alloc * sizeof(struct symt*)) :
|
||||||
|
|
|
@ -338,6 +338,7 @@ struct module
|
||||||
int sortlist_valid;
|
int sortlist_valid;
|
||||||
unsigned num_sorttab; /* number of symbols with addresses */
|
unsigned num_sorttab; /* number of symbols with addresses */
|
||||||
unsigned num_symbols;
|
unsigned num_symbols;
|
||||||
|
unsigned sorttab_size;
|
||||||
struct symt_ht** addr_sorttab;
|
struct symt_ht** addr_sorttab;
|
||||||
struct hash_table ht_symbols;
|
struct hash_table ht_symbols;
|
||||||
void (*loc_compute)(struct process* pcs,
|
void (*loc_compute)(struct process* pcs,
|
||||||
|
|
|
@ -59,6 +59,7 @@ struct dump_context
|
||||||
/* module information */
|
/* module information */
|
||||||
struct dump_module* modules;
|
struct dump_module* modules;
|
||||||
unsigned num_modules;
|
unsigned num_modules;
|
||||||
|
unsigned alloc_modules;
|
||||||
/* exception information */
|
/* exception information */
|
||||||
/* output information */
|
/* output information */
|
||||||
MINIDUMP_TYPE type;
|
MINIDUMP_TYPE type;
|
||||||
|
@ -66,6 +67,7 @@ struct dump_context
|
||||||
RVA rva;
|
RVA rva;
|
||||||
struct dump_memory* mem;
|
struct dump_memory* mem;
|
||||||
unsigned num_mem;
|
unsigned num_mem;
|
||||||
|
unsigned alloc_mem;
|
||||||
/* callback information */
|
/* callback information */
|
||||||
MINIDUMP_CALLBACK_INFORMATION* cb;
|
MINIDUMP_CALLBACK_INFORMATION* cb;
|
||||||
};
|
};
|
||||||
|
@ -253,11 +255,17 @@ static BOOL add_module(struct dump_context* dc, const WCHAR* name,
|
||||||
BOOL is_elf)
|
BOOL is_elf)
|
||||||
{
|
{
|
||||||
if (!dc->modules)
|
if (!dc->modules)
|
||||||
|
{
|
||||||
|
dc->alloc_modules = 32;
|
||||||
dc->modules = HeapAlloc(GetProcessHeap(), 0,
|
dc->modules = HeapAlloc(GetProcessHeap(), 0,
|
||||||
++dc->num_modules * sizeof(*dc->modules));
|
dc->alloc_modules * sizeof(*dc->modules));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
dc->alloc_modules *= 2;
|
||||||
dc->modules = HeapReAlloc(GetProcessHeap(), 0, dc->modules,
|
dc->modules = HeapReAlloc(GetProcessHeap(), 0, dc->modules,
|
||||||
++dc->num_modules * sizeof(*dc->modules));
|
dc->alloc_modules * sizeof(*dc->modules));
|
||||||
|
}
|
||||||
if (!dc->modules) return FALSE;
|
if (!dc->modules) return FALSE;
|
||||||
if (is_elf ||
|
if (is_elf ||
|
||||||
!GetModuleFileNameExW(dc->hProcess, (HMODULE)base,
|
!GetModuleFileNameExW(dc->hProcess, (HMODULE)base,
|
||||||
|
@ -382,17 +390,23 @@ static void fetch_module_versioninfo(LPCWSTR filename, VS_FIXEDFILEINFO* ffi)
|
||||||
static void add_memory_block(struct dump_context* dc, ULONG64 base, ULONG size, ULONG rva)
|
static void add_memory_block(struct dump_context* dc, ULONG64 base, ULONG size, ULONG rva)
|
||||||
{
|
{
|
||||||
if (dc->mem)
|
if (dc->mem)
|
||||||
|
{
|
||||||
|
dc->alloc_mem *= 2;
|
||||||
dc->mem = HeapReAlloc(GetProcessHeap(), 0, dc->mem,
|
dc->mem = HeapReAlloc(GetProcessHeap(), 0, dc->mem,
|
||||||
++dc->num_mem * sizeof(*dc->mem));
|
dc->alloc_mem * sizeof(*dc->mem));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
dc->mem = HeapAlloc(GetProcessHeap(), 0, ++dc->num_mem * sizeof(*dc->mem));
|
{
|
||||||
|
dc->alloc_mem = 32;
|
||||||
|
dc->mem = HeapAlloc(GetProcessHeap(), 0, dc->alloc_mem * sizeof(*dc->mem));
|
||||||
|
}
|
||||||
if (dc->mem)
|
if (dc->mem)
|
||||||
{
|
{
|
||||||
dc->mem[dc->num_mem - 1].base = base;
|
dc->mem[dc->num_mem - 1].base = base;
|
||||||
dc->mem[dc->num_mem - 1].size = size;
|
dc->mem[dc->num_mem - 1].size = size;
|
||||||
dc->mem[dc->num_mem - 1].rva = rva;
|
dc->mem[dc->num_mem - 1].rva = rva;
|
||||||
}
|
}
|
||||||
else dc->num_mem = 0;
|
else dc->num_mem = dc->alloc_mem = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
|
@ -867,10 +881,12 @@ BOOL WINAPI MiniDumpWriteDump(HANDLE hProcess, DWORD pid, HANDLE hFile,
|
||||||
dc.pid = pid;
|
dc.pid = pid;
|
||||||
dc.modules = NULL;
|
dc.modules = NULL;
|
||||||
dc.num_modules = 0;
|
dc.num_modules = 0;
|
||||||
|
dc.alloc_modules = 0;
|
||||||
dc.cb = CallbackParam;
|
dc.cb = CallbackParam;
|
||||||
dc.type = DumpType;
|
dc.type = DumpType;
|
||||||
dc.mem = NULL;
|
dc.mem = NULL;
|
||||||
dc.num_mem = 0;
|
dc.num_mem = 0;
|
||||||
|
dc.alloc_mem = 0;
|
||||||
dc.rva = 0;
|
dc.rva = 0;
|
||||||
|
|
||||||
if (!fetch_processes_info(&dc)) return FALSE;
|
if (!fetch_processes_info(&dc)) return FALSE;
|
||||||
|
|
|
@ -168,6 +168,7 @@ struct module* module_new(struct process* pcs, const WCHAR* name,
|
||||||
module->type = type;
|
module->type = type;
|
||||||
module->is_virtual = virtual ? TRUE : FALSE;
|
module->is_virtual = virtual ? TRUE : FALSE;
|
||||||
module->sortlist_valid = FALSE;
|
module->sortlist_valid = FALSE;
|
||||||
|
module->sorttab_size = 0;
|
||||||
module->addr_sorttab = NULL;
|
module->addr_sorttab = NULL;
|
||||||
module->num_sorttab = 0;
|
module->num_sorttab = 0;
|
||||||
module->num_symbols = 0;
|
module->num_symbols = 0;
|
||||||
|
@ -1037,6 +1038,7 @@ DWORD64 WINAPI SymGetModuleBase64(HANDLE hProcess, DWORD64 dwAddr)
|
||||||
void module_reset_debug_info(struct module* module)
|
void module_reset_debug_info(struct module* module)
|
||||||
{
|
{
|
||||||
module->sortlist_valid = TRUE;
|
module->sortlist_valid = TRUE;
|
||||||
|
module->sorttab_size = 0;
|
||||||
module->addr_sorttab = NULL;
|
module->addr_sorttab = NULL;
|
||||||
module->num_sorttab = module->num_symbols = 0;
|
module->num_sorttab = module->num_symbols = 0;
|
||||||
hash_table_destroy(&module->ht_symbols);
|
hash_table_destroy(&module->ht_symbols);
|
||||||
|
|
|
@ -486,18 +486,23 @@ static int codeview_add_type(unsigned int typeno, struct symt* dt)
|
||||||
if ((typeno >> 24) != 0)
|
if ((typeno >> 24) != 0)
|
||||||
FIXME("No module index while inserting type-id assumption is wrong %x\n",
|
FIXME("No module index while inserting type-id assumption is wrong %x\n",
|
||||||
typeno);
|
typeno);
|
||||||
while (typeno - FIRST_DEFINABLE_TYPE >= cv_current_module->num_defined_types)
|
if (typeno - FIRST_DEFINABLE_TYPE >= cv_current_module->num_defined_types)
|
||||||
{
|
{
|
||||||
cv_current_module->num_defined_types += 0x100;
|
|
||||||
if (cv_current_module->defined_types)
|
if (cv_current_module->defined_types)
|
||||||
|
{
|
||||||
|
cv_current_module->num_defined_types = max( cv_current_module->num_defined_types * 2,
|
||||||
|
typeno - FIRST_DEFINABLE_TYPE + 1 );
|
||||||
cv_current_module->defined_types = HeapReAlloc(GetProcessHeap(),
|
cv_current_module->defined_types = HeapReAlloc(GetProcessHeap(),
|
||||||
HEAP_ZERO_MEMORY, cv_current_module->defined_types,
|
HEAP_ZERO_MEMORY, cv_current_module->defined_types,
|
||||||
cv_current_module->num_defined_types * sizeof(struct symt*));
|
cv_current_module->num_defined_types * sizeof(struct symt*));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
cv_current_module->num_defined_types = max( 256, typeno - FIRST_DEFINABLE_TYPE + 1 );
|
||||||
cv_current_module->defined_types = HeapAlloc(GetProcessHeap(),
|
cv_current_module->defined_types = HeapAlloc(GetProcessHeap(),
|
||||||
HEAP_ZERO_MEMORY,
|
HEAP_ZERO_MEMORY,
|
||||||
cv_current_module->num_defined_types * sizeof(struct symt*));
|
cv_current_module->num_defined_types * sizeof(struct symt*));
|
||||||
|
}
|
||||||
if (cv_current_module->defined_types == NULL) return FALSE;
|
if (cv_current_module->defined_types == NULL) return FALSE;
|
||||||
}
|
}
|
||||||
if (cv_current_module->defined_types[typeno - FIRST_DEFINABLE_TYPE])
|
if (cv_current_module->defined_types[typeno - FIRST_DEFINABLE_TYPE])
|
||||||
|
|
|
@ -76,13 +76,18 @@ unsigned source_new(struct module* module, const char* base, const char* name)
|
||||||
int len = strlen(full) + 1;
|
int len = strlen(full) + 1;
|
||||||
if (module->sources_used + len + 1 > module->sources_alloc)
|
if (module->sources_used + len + 1 > module->sources_alloc)
|
||||||
{
|
{
|
||||||
/* Alloc by block of 256 bytes */
|
|
||||||
module->sources_alloc = (module->sources_used + len + 1 + 255) & ~255;
|
|
||||||
if (!module->sources)
|
if (!module->sources)
|
||||||
|
{
|
||||||
|
module->sources_alloc = (module->sources_used + len + 1 + 255) & ~255;
|
||||||
module->sources = HeapAlloc(GetProcessHeap(), 0, module->sources_alloc);
|
module->sources = HeapAlloc(GetProcessHeap(), 0, module->sources_alloc);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
module->sources_alloc = max( module->sources_alloc * 2,
|
||||||
|
(module->sources_used + len + 1 + 255) & ~255 );
|
||||||
module->sources = HeapReAlloc(GetProcessHeap(), 0, module->sources,
|
module->sources = HeapReAlloc(GetProcessHeap(), 0, module->sources,
|
||||||
module->sources_alloc);
|
module->sources_alloc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = module->sources_used;
|
ret = module->sources_used;
|
||||||
memcpy(module->sources + module->sources_used, full, len);
|
memcpy(module->sources + module->sources_used, full, len);
|
||||||
|
|
|
@ -180,14 +180,18 @@ static int stabs_new_include(const char* file, unsigned long val)
|
||||||
{
|
{
|
||||||
if (num_include_def == num_alloc_include_def)
|
if (num_include_def == num_alloc_include_def)
|
||||||
{
|
{
|
||||||
num_alloc_include_def += 256;
|
|
||||||
if (!include_defs)
|
if (!include_defs)
|
||||||
include_defs = HeapAlloc(GetProcessHeap(), 0,
|
{
|
||||||
|
num_alloc_include_def = 256;
|
||||||
|
include_defs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
sizeof(include_defs[0]) * num_alloc_include_def);
|
sizeof(include_defs[0]) * num_alloc_include_def);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
include_defs = HeapReAlloc(GetProcessHeap(), 0, include_defs,
|
{
|
||||||
|
num_alloc_include_def *= 2;
|
||||||
|
include_defs = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, include_defs,
|
||||||
sizeof(include_defs[0]) * num_alloc_include_def);
|
sizeof(include_defs[0]) * num_alloc_include_def);
|
||||||
memset(include_defs + num_include_def, 0, sizeof(include_defs[0]) * 256);
|
}
|
||||||
}
|
}
|
||||||
include_defs[num_include_def].name = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(file) + 1), file);
|
include_defs[num_include_def].name = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(file) + 1), file);
|
||||||
include_defs[num_include_def].value = val;
|
include_defs[num_include_def].value = val;
|
||||||
|
@ -262,13 +266,13 @@ static struct symt** stabs_find_ref(long filenr, long subnr)
|
||||||
{
|
{
|
||||||
if (cu_nrofentries <= subnr)
|
if (cu_nrofentries <= subnr)
|
||||||
{
|
{
|
||||||
|
cu_nrofentries = max( cu_nrofentries * 2, subnr + 1 );
|
||||||
if (!cu_vector)
|
if (!cu_vector)
|
||||||
cu_vector = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
cu_vector = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
sizeof(cu_vector[0]) * (subnr+1));
|
sizeof(cu_vector[0]) * cu_nrofentries);
|
||||||
else
|
else
|
||||||
cu_vector = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
cu_vector = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
cu_vector, sizeof(cu_vector[0]) * (subnr+1));
|
cu_vector, sizeof(cu_vector[0]) * cu_nrofentries);
|
||||||
cu_nrofentries = subnr + 1;
|
|
||||||
}
|
}
|
||||||
ret = &cu_vector[subnr];
|
ret = &cu_vector[subnr];
|
||||||
}
|
}
|
||||||
|
@ -281,13 +285,13 @@ static struct symt** stabs_find_ref(long filenr, long subnr)
|
||||||
|
|
||||||
if (idef->nrofentries <= subnr)
|
if (idef->nrofentries <= subnr)
|
||||||
{
|
{
|
||||||
|
idef->nrofentries = max( idef->nrofentries * 2, subnr + 1 );
|
||||||
if (!idef->vector)
|
if (!idef->vector)
|
||||||
idef->vector = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
idef->vector = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
sizeof(idef->vector[0]) * (subnr+1));
|
sizeof(idef->vector[0]) * idef->nrofentries);
|
||||||
else
|
else
|
||||||
idef->vector = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
idef->vector = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
idef->vector, sizeof(idef->vector[0]) * (subnr+1));
|
idef->vector, sizeof(idef->vector[0]) * idef->nrofentries);
|
||||||
idef->nrofentries = subnr + 1;
|
|
||||||
}
|
}
|
||||||
ret = &idef->vector[subnr];
|
ret = &idef->vector[subnr];
|
||||||
}
|
}
|
||||||
|
@ -1154,13 +1158,18 @@ static inline void pending_make_room(struct pending_list* pending)
|
||||||
{
|
{
|
||||||
if (pending->num == pending->allocated)
|
if (pending->num == pending->allocated)
|
||||||
{
|
{
|
||||||
pending->allocated += 8;
|
|
||||||
if (!pending->objs)
|
if (!pending->objs)
|
||||||
|
{
|
||||||
|
pending->allocated = 8;
|
||||||
pending->objs = HeapAlloc(GetProcessHeap(), 0,
|
pending->objs = HeapAlloc(GetProcessHeap(), 0,
|
||||||
pending->allocated * sizeof(pending->objs[0]));
|
pending->allocated * sizeof(pending->objs[0]));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
pending->allocated *= 2;
|
||||||
pending->objs = HeapReAlloc(GetProcessHeap(), 0, pending->objs,
|
pending->objs = HeapReAlloc(GetProcessHeap(), 0, pending->objs,
|
||||||
pending->allocated * sizeof(pending->objs[0]));
|
pending->allocated * sizeof(pending->objs[0]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1311,7 +1320,7 @@ BOOL stabs_parse(struct module* module, unsigned long load_offset,
|
||||||
unsigned len = strlen(ptr);
|
unsigned len = strlen(ptr);
|
||||||
if (strlen(stabbuff) + len > stabbufflen)
|
if (strlen(stabbuff) + len > stabbufflen)
|
||||||
{
|
{
|
||||||
stabbufflen += 65536;
|
stabbufflen *= 2;
|
||||||
stabbuff = HeapReAlloc(GetProcessHeap(), 0, stabbuff, stabbufflen);
|
stabbuff = HeapReAlloc(GetProcessHeap(), 0, stabbuff, stabbufflen);
|
||||||
}
|
}
|
||||||
strncat(stabbuff, ptr, len - 1);
|
strncat(stabbuff, ptr, len - 1);
|
||||||
|
|
|
@ -70,13 +70,22 @@ int symt_cmp_addr(const void* p1, const void* p2)
|
||||||
static BOOL symt_grow_sorttab(struct module* module, unsigned sz)
|
static BOOL symt_grow_sorttab(struct module* module, unsigned sz)
|
||||||
{
|
{
|
||||||
struct symt_ht** new;
|
struct symt_ht** new;
|
||||||
|
unsigned int size;
|
||||||
|
|
||||||
|
if (sz <= module->sorttab_size) return TRUE;
|
||||||
if (module->addr_sorttab)
|
if (module->addr_sorttab)
|
||||||
|
{
|
||||||
|
size = module->sorttab_size * 2;
|
||||||
new = HeapReAlloc(GetProcessHeap(), 0, module->addr_sorttab,
|
new = HeapReAlloc(GetProcessHeap(), 0, module->addr_sorttab,
|
||||||
sz * sizeof(struct symt_ht*));
|
size * sizeof(struct symt_ht*));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
new = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(struct symt_ht*));
|
{
|
||||||
|
size = 64;
|
||||||
|
new = HeapAlloc(GetProcessHeap(), 0, size * sizeof(struct symt_ht*));
|
||||||
|
}
|
||||||
if (!new) return FALSE;
|
if (!new) return FALSE;
|
||||||
|
module->sorttab_size = size;
|
||||||
module->addr_sorttab = new;
|
module->addr_sorttab = new;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue