summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorNoel Grandin <noel@peralex.com>2022-03-23 11:45:34 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2022-03-23 13:18:48 +0100
commit4f900a536940fce989cd9e3d688a8391e6edf62f (patch)
tree71429cfa49ad8711dd4f009168493e3279d080a0 /sal
parent095cd83fd266a3549ff9b2ad5abd6f05c3852b33 (diff)
try to improve stack dumping on windows
noting that this commit is completely blind. But we're not getting good stacks on jenkins, and it doesn't look right to me that we're using 64-bit functions on 32-bit stacks, so make the 32-bit paths consistently use 32-bit functions and structures. Change-Id: I413ab97001246c442df151700cc618df4391e03b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131964 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sal')
-rw-r--r--sal/cppunittester/cppunittester.cxx41
1 files changed, 36 insertions, 5 deletions
diff --git a/sal/cppunittester/cppunittester.cxx b/sal/cppunittester/cppunittester.cxx
index f75caccbc143..7d5ce39edf12 100644
--- a/sal/cppunittester/cppunittester.cxx
+++ b/sal/cppunittester/cppunittester.cxx
@@ -495,7 +495,11 @@ static void printStack( CONTEXT* ctx )
HANDLE process;
HANDLE thread;
HMODULE hModule;
+#ifdef _M_AMD64
STACKFRAME64 stack;
+#else
+ STACKFRAME stack;
+#endif
ULONG frame;
DWORD64 displacement;
DWORD disp;
@@ -503,7 +507,11 @@ static void printStack( CONTEXT* ctx )
char module[MaxNameLen];
PSYMBOL_INFO pSymbol = reinterpret_cast<PSYMBOL_INFO>(buffer);
+#ifdef _M_AMD64
memset( &stack, 0, sizeof( STACKFRAME64 ) );
+#else
+ memset( &stack, 0, sizeof( STACKFRAME ) );
+#endif
process = GetCurrentProcess();
thread = GetCurrentThread();
@@ -519,19 +527,21 @@ static void printStack( CONTEXT* ctx )
SymInitialize( process, nullptr, TRUE ); //load symbols
+#ifdef _M_AMD64
std::unique_ptr<IMAGEHLP_LINE64> line(new IMAGEHLP_LINE64);
line->SizeOfStruct = sizeof(IMAGEHLP_LINE64);
+#else
+ std::unique_ptr<IMAGEHLP_LINE> line(new IMAGEHLP_LINE);
+ line->SizeOfStruct = sizeof(IMAGEHLP_LINE);
+#endif
for( frame = 0; ; frame++ )
{
//get next call from stack
+#ifdef _M_AMD64
result = StackWalk64
(
-#if defined(_M_AMD64)
IMAGE_FILE_MACHINE_AMD64,
-#else
- IMAGE_FILE_MACHINE_I386,
-#endif
process,
thread,
&stack,
@@ -541,6 +551,20 @@ static void printStack( CONTEXT* ctx )
SymGetModuleBase64,
nullptr
);
+#else
+ result = StackWalk
+ (
+ IMAGE_FILE_MACHINE_I386,
+ process,
+ thread,
+ &stack,
+ ctx,
+ nullptr,
+ SymFunctionTableAccess,
+ SymGetModuleBase,
+ nullptr
+ );
+#endif
if( !result )
break;
@@ -548,10 +572,17 @@ static void printStack( CONTEXT* ctx )
//get symbol name for address
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;
+#ifdef _M_AMD64
SymFromAddr(process, static_cast< ULONG64 >(stack.AddrPC.Offset), &displacement, pSymbol);
-
+#else
+ SymFromAddr(process, static_cast< ULONG >(stack.AddrPC.Offset), &displacement, pSymbol);
+#endif
//try to get line
+#ifdef _M_AMD64
if (SymGetLineFromAddr64(process, stack.AddrPC.Offset, &disp, line.get()))
+#else
+ if (SymGetLineFromAddr(process, stack.AddrPC.Offset, &disp, line.get()))
+#endif
{
printf("\tat %s in %s: line: %lu: address: 0x%0I64X\n", pSymbol->Name, line->FileName, line->LineNumber, pSymbol->Address);
}