[PATCH 07/10] dbghelp/tests: StackWalk64 testing now support external process
Eric Pouech
eric.pouech at gmail.com
Thu Jul 15 02:39:35 CDT 2021
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/dbghelp/tests/dbghelp.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/dlls/dbghelp/tests/dbghelp.c b/dlls/dbghelp/tests/dbghelp.c
index a9d3a9beebc..b9f9abe1a07 100644
--- a/dlls/dbghelp/tests/dbghelp.c
+++ b/dlls/dbghelp/tests/dbghelp.c
@@ -40,6 +40,8 @@ struct debuggee
*/
};
+extern DWORD stack_walk_bottom(void);
+
#if defined(__i386__) || defined(__x86_64__)
static DWORD CALLBACK stack_walk_thread(void *arg)
@@ -56,7 +58,7 @@ static void test_stack_walk(const struct debuggee* dbg)
STACKFRAME64 frame = {{0}}, frame0;
BOOL found_our_frame = FALSE;
DWORD machine;
- DWORD64 disp;
+ DWORD64 disp, stack_walk_thread_addr;
CONTEXT ctx;
BOOL ret;
@@ -102,24 +104,31 @@ static void test_stack_walk(const struct debuggee* dbg)
ok(frame.AddrReturn.Offset && frame.AddrReturn.Offset != frame.AddrPC.Offset,
"got bad return address %s\n", wine_dbgstr_longlong(frame.AddrReturn.Offset));
+ if (dbg->external_process)
+ {
+ si->SizeOfStruct = sizeof(*si);
+ si->MaxNameLen = 200;
+ ret = SymFromName(dbg->hProcess, "stack_walk_bottom", si);
+ ok(ret, "SymFromName failed\n");
+ stack_walk_thread_addr = si->Address;
+ }
+ else
+ stack_walk_thread_addr = (DWORD_PTR)&stack_walk_thread;
while (frame.AddrReturn.Offset)
{
- char *addr;
-
ret = StackWalk64(machine, dbg->hProcess, dbg->hThread, &frame, &ctx, NULL,
SymFunctionTableAccess64, SymGetModuleBase64, NULL);
ok(ret, "StackWalk64() failed: %u\n", GetLastError());
- addr = (void *)(DWORD_PTR)frame.AddrPC.Offset;
-
- if (!found_our_frame && addr > (char *)stack_walk_thread && addr < (char *)stack_walk_thread + 0x100)
+ if (!found_our_frame && frame.AddrPC.Offset > stack_walk_thread_addr && frame.AddrPC.Offset < stack_walk_thread_addr + 0x100)
{
found_our_frame = TRUE;
si->SizeOfStruct = sizeof(SYMBOL_INFO);
si->MaxNameLen = 200;
if (SymFromAddr(dbg->hProcess, frame.AddrPC.Offset, &disp, si))
- ok(!strcmp(si->Name, "stack_walk_thread"), "got wrong name %s\n", si->Name);
+ ok(dbg->external_process ? !strcmp(si->Name, "stack_walk_bottom") : !strcmp(si->Name, "stack_walk_thread"),
+ "got wrong name %s\n", si->Name);
}
}
More information about the wine-devel
mailing list