- enhanced 'info share' output
- made use of new dbghelp pure ELF symbol lookup
This commit is contained in:
parent
6e2bca34cf
commit
10e8ed071a
|
@ -120,6 +120,7 @@ static const char* get_symtype_str(SYM_TYPE st)
|
||||||
{
|
{
|
||||||
switch (st)
|
switch (st)
|
||||||
{
|
{
|
||||||
|
case -1: return "\\";
|
||||||
default:
|
default:
|
||||||
case SymNone: return "--none--";
|
case SymNone: return "--none--";
|
||||||
case SymCoff: return "COFF";
|
case SymCoff: return "COFF";
|
||||||
|
@ -129,6 +130,7 @@ static const char* get_symtype_str(SYM_TYPE st)
|
||||||
case SymDeferred: return "Deferred";
|
case SymDeferred: return "Deferred";
|
||||||
case SymSym: return "Sym";
|
case SymSym: return "Sym";
|
||||||
case SymDia: return "DIA";
|
case SymDia: return "DIA";
|
||||||
|
case NumSymTypes: return "Stabs";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,11 +141,11 @@ struct info_module
|
||||||
unsigned num_used;
|
unsigned num_used;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void module_print_info(const IMAGEHLP_MODULE* mi)
|
static void module_print_info(const IMAGEHLP_MODULE* mi, SYM_TYPE st)
|
||||||
{
|
{
|
||||||
dbg_printf("0x%08lx-%08lx\t%-16s%s\n",
|
dbg_printf("0x%08lx-%08lx\t%-16s%s\n",
|
||||||
mi->BaseOfImage, mi->BaseOfImage + mi->ImageSize,
|
mi->BaseOfImage, mi->BaseOfImage + mi->ImageSize,
|
||||||
get_symtype_str(mi->SymType), mi->ModuleName);
|
get_symtype_str(st), mi->ModuleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int module_compare(const void* p1, const void* p2)
|
static int module_compare(const void* p1, const void* p2)
|
||||||
|
@ -172,7 +174,6 @@ static BOOL CALLBACK info_mod_cb(PSTR mod_name, DWORD base, void* ctx)
|
||||||
im->mi[im->num_used].SizeOfStruct = sizeof(im->mi[im->num_used]);
|
im->mi[im->num_used].SizeOfStruct = sizeof(im->mi[im->num_used]);
|
||||||
if (SymGetModuleInfo(dbg_curr_process->handle, base, &im->mi[im->num_used]))
|
if (SymGetModuleInfo(dbg_curr_process->handle, base, &im->mi[im->num_used]))
|
||||||
{
|
{
|
||||||
module_print_info(&im->mi[im->num_used]);
|
|
||||||
im->num_used++;
|
im->num_used++;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -202,7 +203,7 @@ void info_win32_module(DWORD base)
|
||||||
dbg_printf("'0x%08lx' is not a valid module address\n", base);
|
dbg_printf("'0x%08lx' is not a valid module address\n", base);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
module_print_info(&mi);
|
module_print_info(&mi, mi.SymType);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -229,14 +230,14 @@ void info_win32_module(DWORD base)
|
||||||
if (strstr(im.mi[i].ModuleName, "<elf>"))
|
if (strstr(im.mi[i].ModuleName, "<elf>"))
|
||||||
{
|
{
|
||||||
dbg_printf("ELF\t");
|
dbg_printf("ELF\t");
|
||||||
module_print_info(&im.mi[i]);
|
module_print_info(&im.mi[i], (im.mi[i].SymType == SymDia) ? NumSymTypes : im.mi[i].SymType);
|
||||||
/* print all modules embedded in this one */
|
/* print all modules embedded in this one */
|
||||||
for (j = 0; j < im.num_used; j++)
|
for (j = 0; j < im.num_used; j++)
|
||||||
{
|
{
|
||||||
if (!strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[i], &im.mi[j]))
|
if (!strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[i], &im.mi[j]))
|
||||||
{
|
{
|
||||||
dbg_printf(" \\-PE\t");
|
dbg_printf(" \\-PE\t");
|
||||||
module_print_info(&im.mi[j]);
|
module_print_info(&im.mi[j], -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,7 +254,7 @@ void info_win32_module(DWORD base)
|
||||||
dbg_printf("ELF\t");
|
dbg_printf("ELF\t");
|
||||||
else
|
else
|
||||||
dbg_printf("PE\t");
|
dbg_printf("PE\t");
|
||||||
module_print_info(&im.mi[i]);
|
module_print_info(&im.mi[i], im.mi[i].SymType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HeapFree(GetProcessHeap(), 0, im.mi);
|
HeapFree(GetProcessHeap(), 0, im.mi);
|
||||||
|
@ -704,7 +705,6 @@ void info_wine_dbg_channel(BOOL turn_on, const char* chnl, const char* name)
|
||||||
|
|
||||||
if (symbol_get_lvalue("first_dll", -1, &lvalue, FALSE) != sglv_found)
|
if (symbol_get_lvalue("first_dll", -1, &lvalue, FALSE) != sglv_found)
|
||||||
{
|
{
|
||||||
dbg_printf("Can't get first_dll symbol\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addr = memory_to_linear_addr(&lvalue.addr);
|
addr = memory_to_linear_addr(&lvalue.addr);
|
||||||
|
|
|
@ -204,6 +204,7 @@ enum sym_get_lval symbol_get_lvalue(const char* name, const int lineno,
|
||||||
char tmp[sizeof(SYMBOL_INFO) + 256];
|
char tmp[sizeof(SYMBOL_INFO) + 256];
|
||||||
SYMBOL_INFO* si = (SYMBOL_INFO*)tmp;
|
SYMBOL_INFO* si = (SYMBOL_INFO*)tmp;
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
DWORD opt;
|
||||||
|
|
||||||
if (strlen(name) + 4 > sizeof(buffer))
|
if (strlen(name) + 4 > sizeof(buffer))
|
||||||
{
|
{
|
||||||
|
@ -223,16 +224,27 @@ enum sym_get_lval symbol_get_lvalue(const char* name, const int lineno,
|
||||||
buffer[1] = '!';
|
buffer[1] = '!';
|
||||||
strcpy(&buffer[2], name);
|
strcpy(&buffer[2], name);
|
||||||
|
|
||||||
|
/* this is a wine specific options to return also ELF modules in the
|
||||||
|
* enumeration
|
||||||
|
*/
|
||||||
|
SymSetOptions((opt = SymGetOptions()) | 0x40000000);
|
||||||
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
||||||
|
{
|
||||||
|
SymSetOptions(opt);
|
||||||
return sglv_unknown;
|
return sglv_unknown;
|
||||||
|
}
|
||||||
|
|
||||||
if (!sgv.num && (name[0] != '_'))
|
if (!sgv.num && (name[0] != '_'))
|
||||||
{
|
{
|
||||||
buffer[2] = '_';
|
buffer[2] = '_';
|
||||||
strcpy(&buffer[3], name);
|
strcpy(&buffer[3], name);
|
||||||
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
||||||
|
{
|
||||||
|
SymSetOptions(opt);
|
||||||
return sglv_unknown;
|
return sglv_unknown;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
SymSetOptions(opt);
|
||||||
|
|
||||||
/* now grab local symbols */
|
/* now grab local symbols */
|
||||||
si->SizeOfStruct = sizeof(*si);
|
si->SizeOfStruct = sizeof(*si);
|
||||||
|
@ -426,6 +438,7 @@ BOOL symbol_get_line(const char* filename, const char* name, IMAGEHLP_LINE* line
|
||||||
{
|
{
|
||||||
struct sgv_data sgv;
|
struct sgv_data sgv;
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
DWORD opt;
|
||||||
|
|
||||||
sgv.num = 0;
|
sgv.num = 0;
|
||||||
sgv.num_thunks = 0;
|
sgv.num_thunks = 0;
|
||||||
|
@ -439,16 +452,27 @@ BOOL symbol_get_line(const char* filename, const char* name, IMAGEHLP_LINE* line
|
||||||
buffer[1] = '!';
|
buffer[1] = '!';
|
||||||
strcpy(&buffer[2], name);
|
strcpy(&buffer[2], name);
|
||||||
|
|
||||||
|
/* this is a wine specific options to return also ELF modules in the
|
||||||
|
* enumeration
|
||||||
|
*/
|
||||||
|
SymSetOptions((opt = SymGetOptions()) | 0x40000000);
|
||||||
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
||||||
|
{
|
||||||
|
SymSetOptions(opt);
|
||||||
return sglv_unknown;
|
return sglv_unknown;
|
||||||
|
}
|
||||||
|
|
||||||
if (!sgv.num && (name[0] != '_'))
|
if (!sgv.num && (name[0] != '_'))
|
||||||
{
|
{
|
||||||
buffer[2] = '_';
|
buffer[2] = '_';
|
||||||
strcpy(&buffer[3], name);
|
strcpy(&buffer[3], name);
|
||||||
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
if (!SymEnumSymbols(dbg_curr_process->handle, 0, buffer, sgv_cb, (void*)&sgv))
|
||||||
|
{
|
||||||
|
SymSetOptions(opt);
|
||||||
return sglv_unknown;
|
return sglv_unknown;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
SymSetOptions(opt);
|
||||||
|
|
||||||
switch (sgv.num)
|
switch (sgv.num)
|
||||||
{
|
{
|
||||||
|
@ -547,6 +571,7 @@ static BOOL CALLBACK symbols_info_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
|
||||||
void symbol_info(const char* str)
|
void symbol_info(const char* str)
|
||||||
{
|
{
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
DWORD opt;
|
||||||
|
|
||||||
if (strlen(str) + 3 >= sizeof(buffer))
|
if (strlen(str) + 3 >= sizeof(buffer))
|
||||||
{
|
{
|
||||||
|
@ -556,5 +581,10 @@ void symbol_info(const char* str)
|
||||||
buffer[0] = '*';
|
buffer[0] = '*';
|
||||||
buffer[1] = '!';
|
buffer[1] = '!';
|
||||||
strcpy(&buffer[2], str);
|
strcpy(&buffer[2], str);
|
||||||
|
/* this is a wine specific options to return also ELF modules in the
|
||||||
|
* enumeration
|
||||||
|
*/
|
||||||
|
SymSetOptions((opt = SymGetOptions()) | 0x40000000);
|
||||||
SymEnumSymbols(dbg_curr_process->handle, 0, buffer, symbols_info_cb, NULL);
|
SymEnumSymbols(dbg_curr_process->handle, 0, buffer, symbols_info_cb, NULL);
|
||||||
|
SymSetOptions(opt);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,9 +42,8 @@
|
||||||
* - UI
|
* - UI
|
||||||
* + enable back the limited output (depth of structure printing and number of
|
* + enable back the limited output (depth of structure printing and number of
|
||||||
* lines)
|
* lines)
|
||||||
|
* + make the output as close as possible to what gdb does
|
||||||
* - symbol management:
|
* - symbol management:
|
||||||
* + in most of the module enumeration for symbol lookup, we don't search in
|
|
||||||
* the ELF modules (should we turn wine extented flag for ELF modules on ?)
|
|
||||||
* + symbol table loading is broken
|
* + symbol table loading is broken
|
||||||
* - type management:
|
* - type management:
|
||||||
* + some bits of internal types are missing (like type casts and the address
|
* + some bits of internal types are missing (like type casts and the address
|
||||||
|
|
Loading…
Reference in New Issue