Eric Pouech : winedbg: Module info.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jun 27 04:53:49 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 6cff43fd72d5434623b74b557d0cfdaefd0728dc
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=6cff43fd72d5434623b74b557d0cfdaefd0728dc
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Mon Jun 26 21:37:42 2006 +0200
winedbg: Module info.
when requesting info on a module by address, always print the module
ELF/PE pair (if this applies) (and not only the embedded PE), which
can be confusing.
---
programs/winedbg/info.c | 100 ++++++++++++++++++++++-------------------------
1 files changed, 46 insertions(+), 54 deletions(-)
diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c
index 8584d47..d2042bf 100644
--- a/programs/winedbg/info.c
+++ b/programs/winedbg/info.c
@@ -146,6 +146,7 @@ static const char* get_symtype_str(const
struct info_module
{
IMAGEHLP_MODULE64* mi;
+ DWORD base;
unsigned num_alloc;
unsigned num_used;
};
@@ -199,79 +200,70 @@ static BOOL CALLBACK info_mod_cb(PSTR mo
*/
void info_win32_module(DWORD base)
{
+ struct info_module im;
+ int i, j, num_printed = 0;
+ DWORD opt;
+
if (!dbg_curr_process || !dbg_curr_thread)
{
dbg_printf("Cannot get info on module while no process is loaded\n");
return;
}
- if (base)
- {
- IMAGEHLP_MODULE64 mi;
-
- mi.SizeOfStruct = sizeof(mi);
-
- if (!SymGetModuleInfo64(dbg_curr_process->handle, base, &mi))
- {
- dbg_printf("'0x%08lx' is not a valid module address\n", base);
- return;
- }
- module_print_info(&mi, FALSE);
- }
- else
- {
- struct info_module im;
- int i, j;
- DWORD opt;
-
- im.mi = NULL;
- im.num_alloc = im.num_used = 0;
+ im.mi = NULL;
+ im.num_alloc = im.num_used = 0;
- /* this is a wine specific options to return also ELF modules in the
- * enumeration
- */
- SymSetOptions((opt = SymGetOptions()) | 0x40000000);
- SymEnumerateModules64(dbg_curr_process->handle, info_mod_cb, (void*)&im);
- SymSetOptions(opt);
+ /* this is a wine specific options to return also ELF modules in the
+ * enumeration
+ */
+ SymSetOptions((opt = SymGetOptions()) | 0x40000000);
+ SymEnumerateModules64(dbg_curr_process->handle, info_mod_cb, (void*)&im);
+ SymSetOptions(opt);
- qsort(im.mi, im.num_used, sizeof(im.mi[0]), module_compare);
+ qsort(im.mi, im.num_used, sizeof(im.mi[0]), module_compare);
- dbg_printf("Module\tAddress\t\t\tDebug info\tName (%d modules)\n", im.num_used);
+ dbg_printf("Module\tAddress\t\t\tDebug info\tName (%d modules)\n", im.num_used);
- for (i = 0; i < im.num_used; i++)
+ for (i = 0; i < im.num_used; i++)
+ {
+ if (base &&
+ (base < im.mi[i].BaseOfImage || base >= im.mi[i].BaseOfImage + im.mi[i].ImageSize))
+ continue;
+ if (strstr(im.mi[i].ModuleName, "<elf>"))
{
- if (strstr(im.mi[i].ModuleName, "<elf>"))
+ dbg_printf("ELF\t");
+ module_print_info(&im.mi[i], FALSE);
+ /* print all modules embedded in this one */
+ for (j = 0; j < im.num_used; j++)
{
- dbg_printf("ELF\t");
- module_print_info(&im.mi[i], FALSE);
- /* print all modules embedded in this one */
- 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");
- module_print_info(&im.mi[j], TRUE);
- }
+ dbg_printf(" \\-PE\t");
+ module_print_info(&im.mi[j], TRUE);
}
}
- else
+ }
+ else
+ {
+ /* check module is not embedded in another module */
+ for (j = 0; j < im.num_used; j++)
{
- /* check module is not embedded in another module */
- for (j = 0; j < im.num_used; j++)
- {
- if (strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[j], &im.mi[i]))
- break;
- }
- if (j < im.num_used) continue;
- if (strstr(im.mi[i].ModuleName, ".so") || strchr(im.mi[i].ModuleName, '<'))
- dbg_printf("ELF\t");
- else
- dbg_printf("PE\t");
- module_print_info(&im.mi[i], FALSE);
+ if (strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[j], &im.mi[i]))
+ break;
}
+ if (j < im.num_used) continue;
+ if (strstr(im.mi[i].ModuleName, ".so") || strchr(im.mi[i].ModuleName, '<'))
+ dbg_printf("ELF\t");
+ else
+ dbg_printf("PE\t");
+ module_print_info(&im.mi[i], FALSE);
}
- HeapFree(GetProcessHeap(), 0, im.mi);
+ num_printed++;
}
+ HeapFree(GetProcessHeap(), 0, im.mi);
+
+ if (base && !num_printed)
+ dbg_printf("'0x%08lx' is not a valid module address\n", base);
}
struct class_walker
More information about the wine-cvs
mailing list