- for now, it's purely inside the tests/dbghelp.c - the goal is to also allow an external process
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/tests/dbghelp.c | 57 +++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/dlls/dbghelp/tests/dbghelp.c b/dlls/dbghelp/tests/dbghelp.c index a243d047d18..c9bbd90deb4 100644 --- a/dlls/dbghelp/tests/dbghelp.c +++ b/dlls/dbghelp/tests/dbghelp.c @@ -21,6 +21,13 @@ #include "dbghelp.h" #include "wine/test.h"
+struct debuggee +{ + const char* name; /* name of main module */ + HANDLE hProcess; + HANDLE hThread; /* either new thread calling stack_walk_thread, or main thread */ +}; + #if defined(__i386__) || defined(__x86_64__)
static DWORD CALLBACK stack_walk_thread(void *arg) @@ -30,32 +37,19 @@ static DWORD CALLBACK stack_walk_thread(void *arg) return 0; }
-static void test_stack_walk(void) +static void test_stack_walk(const struct debuggee* dbg) { char si_buf[sizeof(SYMBOL_INFO) + 200]; SYMBOL_INFO *si = (SYMBOL_INFO *)si_buf; STACKFRAME64 frame = {{0}}, frame0; BOOL found_our_frame = FALSE; DWORD machine; - HANDLE thread; DWORD64 disp; CONTEXT ctx; - DWORD count; BOOL ret;
- thread = CreateThread(NULL, 0, stack_walk_thread, NULL, 0, NULL); - - /* wait for the thread to suspend itself */ - do - { - Sleep(50); - count = SuspendThread(thread); - ResumeThread(thread); - } - while (!count); - ctx.ContextFlags = CONTEXT_CONTROL; - ret = GetThreadContext(thread, &ctx); + ret = GetThreadContext(dbg->hThread, &ctx); ok(ret, "got error %u\n", ret);
frame.AddrPC.Mode = AddrModeFlat; @@ -84,7 +78,7 @@ static void test_stack_walk(void) frame0 = frame;
/* first invocation just calculates the return address */ - ret = StackWalk64(machine, GetCurrentProcess(), thread, &frame, &ctx, NULL, + ret = StackWalk64(machine, dbg->hProcess, dbg->hThread, &frame, &ctx, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL); ok(ret, "StackWalk64() failed: %u\n", GetLastError()); ok(frame.AddrPC.Offset == frame0.AddrPC.Offset, "expected %s, got %s\n", @@ -100,7 +94,7 @@ static void test_stack_walk(void) { char *addr;
- ret = StackWalk64(machine, GetCurrentProcess(), thread, &frame, &ctx, NULL, + ret = StackWalk64(machine, dbg->hProcess, dbg->hThread, &frame, &ctx, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL); ok(ret, "StackWalk64() failed: %u\n", GetLastError());
@@ -112,12 +106,12 @@ static void test_stack_walk(void)
si->SizeOfStruct = sizeof(SYMBOL_INFO); si->MaxNameLen = 200; - if (SymFromAddr(GetCurrentProcess(), frame.AddrPC.Offset, &disp, si)) + if (SymFromAddr(dbg->hProcess, frame.AddrPC.Offset, &disp, si)) ok(!strcmp(si->Name, "stack_walk_thread"), "got wrong name %s\n", si->Name); } }
- ret = StackWalk64(machine, GetCurrentProcess(), thread, &frame, &ctx, NULL, + ret = StackWalk64(machine, dbg->hProcess, dbg->hThread, &frame, &ctx, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL); ok(!ret, "StackWalk64() should have failed\n");
@@ -126,7 +120,7 @@ static void test_stack_walk(void)
#else /* __i386__ || __x86_64__ */
-static void test_stack_walk(void) +static void test_stack_walk(const struct debuggee* dbg) { }
@@ -134,11 +128,28 @@ static void test_stack_walk(void)
START_TEST(dbghelp) { - BOOL ret = SymInitialize(GetCurrentProcess(), NULL, TRUE); + struct debuggee dbg; + DWORD count; + BOOL ret; + + dbg.name = "self"; + dbg.hProcess = GetCurrentProcess(); + dbg.hThread = CreateThread(NULL, 0, stack_walk_thread, NULL, 0, NULL); + + /* wait for the thread to suspend itself */ + do + { + Sleep(50); + count = SuspendThread(dbg.hThread); + ResumeThread(dbg.hThread); + } + while (!count); + + ret = SymInitialize(dbg.hProcess, NULL, TRUE); ok(ret, "got error %u\n", GetLastError());
- test_stack_walk(); + test_stack_walk(&dbg);
- ret = SymCleanup(GetCurrentProcess()); + ret = SymCleanup(dbg.hProcess); ok(ret, "got error %u\n", GetLastError()); }