@@ -110,7 +110,7 @@ my_malloc_logger(uint32_t aType,
110
110
// stack shows up as having two pthread_cond_wait$UNIX2003 frames.
111
111
const char * name = " new_sem_from_pool" ;
112
112
MozStackWalk (stack_callback, /* skipFrames */ 0 , /* maxFrames */ 0 ,
113
- const_cast <char *>(name), 0 , nullptr );
113
+ const_cast <char *>(name));
114
114
}
115
115
116
116
// This is called from NS_LogInit() and from the stack walking functions, but
@@ -186,7 +186,7 @@ StackWalkInitCriticalAddress()
186
186
}
187
187
#endif
188
188
189
- #if defined(_WIN32) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)) // WIN32 x86 stack walking code
189
+ #if MOZ_STACKWALK_SUPPORTS_WINDOWS
190
190
191
191
#include < windows.h>
192
192
#include < process.h>
@@ -222,7 +222,7 @@ struct WalkStackData
222
222
void ** sps;
223
223
uint32_t sp_size;
224
224
uint32_t sp_count;
225
- void * platformData ;
225
+ CONTEXT* context ;
226
226
};
227
227
228
228
DWORD gStackWalkThread ;
@@ -378,32 +378,34 @@ static void
378
378
WalkStackMain64 (struct WalkStackData * aData)
379
379
{
380
380
// Get a context for the specified thread.
381
- CONTEXT context;
382
- if (!aData->platformData ) {
383
- memset (&context, 0 , sizeof (CONTEXT));
384
- context.ContextFlags = CONTEXT_FULL;
385
- if (!GetThreadContext (aData->thread , &context)) {
381
+ CONTEXT context_buf;
382
+ CONTEXT* context;
383
+ if (!aData->context ) {
384
+ context = &context_buf;
385
+ memset (context, 0 , sizeof (CONTEXT));
386
+ context->ContextFlags = CONTEXT_FULL;
387
+ if (!GetThreadContext (aData->thread , context)) {
386
388
if (aData->walkCallingThread ) {
387
389
PrintError (" GetThreadContext" );
388
390
}
389
391
return ;
390
392
}
391
393
} else {
392
- context = * static_cast <CONTEXT*>( aData->platformData ) ;
394
+ context = aData->context ;
393
395
}
394
396
395
397
#if defined(_M_IX86) || defined(_M_IA64)
396
398
// Setup initial stack frame to walk from.
397
399
STACKFRAME64 frame64;
398
400
memset (&frame64, 0 , sizeof (frame64));
399
401
#ifdef _M_IX86
400
- frame64.AddrPC .Offset = context. Eip ;
401
- frame64.AddrStack .Offset = context. Esp ;
402
- frame64.AddrFrame .Offset = context. Ebp ;
402
+ frame64.AddrPC .Offset = context-> Eip ;
403
+ frame64.AddrStack .Offset = context-> Esp ;
404
+ frame64.AddrFrame .Offset = context-> Ebp ;
403
405
#elif defined _M_IA64
404
- frame64.AddrPC .Offset = context. StIIP ;
405
- frame64.AddrStack .Offset = context. SP ;
406
- frame64.AddrFrame .Offset = context. RsBSP ;
406
+ frame64.AddrPC .Offset = context-> StIIP ;
407
+ frame64.AddrStack .Offset = context-> SP ;
408
+ frame64.AddrFrame .Offset = context-> RsBSP ;
407
409
#endif
408
410
frame64.AddrPC .Mode = AddrModeFlat;
409
411
frame64.AddrStack .Mode = AddrModeFlat;
@@ -452,7 +454,7 @@ WalkStackMain64(struct WalkStackData* aData)
452
454
aData->process ,
453
455
aData->thread ,
454
456
&frame64,
455
- & context,
457
+ context,
456
458
nullptr ,
457
459
SymFunctionTableAccess64, // function table access routine
458
460
SymGetModuleBase64, // module base routine
@@ -479,48 +481,48 @@ WalkStackMain64(struct WalkStackData* aData)
479
481
// If we reach a frame in JIT code, we don't have enough information to
480
482
// unwind, so we have to give up.
481
483
if (sJitCodeRegionStart &&
482
- (uint8_t *)context. Rip >= sJitCodeRegionStart &&
483
- (uint8_t *)context. Rip < sJitCodeRegionStart + sJitCodeRegionSize ) {
484
+ (uint8_t *)context-> Rip >= sJitCodeRegionStart &&
485
+ (uint8_t *)context-> Rip < sJitCodeRegionStart + sJitCodeRegionSize ) {
484
486
break ;
485
487
}
486
488
487
489
// We must also avoid msmpeg2vdec.dll's JIT region: they don't generate
488
490
// unwind data, so their JIT unwind callback just throws up its hands and
489
491
// terminates the process.
490
492
if (sMsMpegJitCodeRegionStart &&
491
- (uint8_t *)context. Rip >= sMsMpegJitCodeRegionStart &&
492
- (uint8_t *)context. Rip < sMsMpegJitCodeRegionStart + sMsMpegJitCodeRegionSize ) {
493
+ (uint8_t *)context-> Rip >= sMsMpegJitCodeRegionStart &&
494
+ (uint8_t *)context-> Rip < sMsMpegJitCodeRegionStart + sMsMpegJitCodeRegionSize ) {
493
495
break ;
494
496
}
495
497
496
498
// 64-bit frame unwinding.
497
499
// Try to look up unwind metadata for the current function.
498
500
ULONG64 imageBase;
499
501
PRUNTIME_FUNCTION runtimeFunction =
500
- RtlLookupFunctionEntry (context. Rip , &imageBase, NULL );
502
+ RtlLookupFunctionEntry (context-> Rip , &imageBase, NULL );
501
503
502
504
if (runtimeFunction) {
503
505
PVOID dummyHandlerData;
504
506
ULONG64 dummyEstablisherFrame;
505
507
RtlVirtualUnwind (UNW_FLAG_NHANDLER,
506
508
imageBase,
507
- context. Rip ,
509
+ context-> Rip ,
508
510
runtimeFunction,
509
- & context,
511
+ context,
510
512
&dummyHandlerData,
511
513
&dummyEstablisherFrame,
512
514
nullptr );
513
515
} else if (firstFrame) {
514
516
// Leaf functions can be unwound by hand.
515
- context. Rip = *reinterpret_cast <DWORD64*>(context. Rsp );
516
- context. Rsp += sizeof (void *);
517
+ context-> Rip = *reinterpret_cast <DWORD64*>(context-> Rsp );
518
+ context-> Rsp += sizeof (void *);
517
519
} else {
518
520
// Something went wrong.
519
521
break ;
520
522
}
521
523
522
- addr = context. Rip ;
523
- spaddr = context. Rsp ;
524
+ addr = context-> Rip ;
525
+ spaddr = context-> Rsp ;
524
526
firstFrame = false ;
525
527
#else
526
528
#error "unknown platform"
@@ -618,9 +620,9 @@ WalkStackThread(void* aData)
618
620
*/
619
621
620
622
MFBT_API bool
621
- MozStackWalk (MozWalkStackCallback aCallback, uint32_t aSkipFrames,
622
- uint32_t aMaxFrames, void * aClosure, uintptr_t aThread ,
623
- void * aPlatformData )
623
+ MozStackWalkThread (MozWalkStackCallback aCallback, uint32_t aSkipFrames,
624
+ uint32_t aMaxFrames, void * aClosure,
625
+ HANDLE aThread, CONTEXT* aContext )
624
626
{
625
627
StackWalkInitCriticalAddress ();
626
628
static HANDLE myProcess = nullptr ;
@@ -637,8 +639,7 @@ MozStackWalk(MozWalkStackCallback aCallback, uint32_t aSkipFrames,
637
639
}
638
640
639
641
HANDLE currentThread = ::GetCurrentThread ();
640
- HANDLE targetThread =
641
- aThread ? reinterpret_cast <HANDLE>(aThread) : currentThread;
642
+ HANDLE targetThread = aThread ? aThread : currentThread;
642
643
data.walkCallingThread = (targetThread == currentThread);
643
644
644
645
// Have to duplicate handle to get a real handle.
@@ -677,7 +678,7 @@ MozStackWalk(MozWalkStackCallback aCallback, uint32_t aSkipFrames,
677
678
data.sps = local_sps;
678
679
data.sp_count = 0 ;
679
680
data.sp_size = ArrayLength (local_sps);
680
- data.platformData = aPlatformData ;
681
+ data.context = aContext ;
681
682
682
683
if (aThread) {
683
684
// If we're walking the stack of another thread, we don't need to
@@ -734,6 +735,13 @@ MozStackWalk(MozWalkStackCallback aCallback, uint32_t aSkipFrames,
734
735
return data.pc_count != 0 ;
735
736
}
736
737
738
+ MFBT_API bool
739
+ MozStackWalk (MozWalkStackCallback aCallback, uint32_t aSkipFrames,
740
+ uint32_t aMaxFrames, void * aClosure)
741
+ {
742
+ return MozStackWalkThread (aCallback, aSkipFrames, aMaxFrames, aClosure,
743
+ nullptr , nullptr );
744
+ }
737
745
738
746
static BOOL CALLBACK
739
747
callbackEspecial64 (
@@ -989,11 +997,8 @@ void DemangleSymbol(const char* aSymbol,
989
997
990
998
MFBT_API bool
991
999
MozStackWalk (MozWalkStackCallback aCallback, uint32_t aSkipFrames,
992
- uint32_t aMaxFrames, void * aClosure, uintptr_t aThread,
993
- void * aPlatformData)
1000
+ uint32_t aMaxFrames, void * aClosure)
994
1001
{
995
- MOZ_ASSERT (!aThread);
996
- MOZ_ASSERT (!aPlatformData);
997
1002
StackWalkInitCriticalAddress ();
998
1003
999
1004
// Get the frame pointer
@@ -1077,11 +1082,8 @@ unwind_callback(struct _Unwind_Context* context, void* closure)
1077
1082
1078
1083
MFBT_API bool
1079
1084
MozStackWalk (MozWalkStackCallback aCallback, uint32_t aSkipFrames,
1080
- uint32_t aMaxFrames, void * aClosure, uintptr_t aThread,
1081
- void * aPlatformData)
1085
+ uint32_t aMaxFrames, void * aClosure)
1082
1086
{
1083
- MOZ_ASSERT (!aThread);
1084
- MOZ_ASSERT (!aPlatformData);
1085
1087
StackWalkInitCriticalAddress ();
1086
1088
unwind_info info;
1087
1089
info.callback = aCallback;
@@ -1150,11 +1152,8 @@ MozDescribeCodeAddress(void* aPC, MozCodeAddressDetails* aDetails)
1150
1152
1151
1153
MFBT_API bool
1152
1154
MozStackWalk (MozWalkStackCallback aCallback, uint32_t aSkipFrames,
1153
- uint32_t aMaxFrames, void * aClosure, uintptr_t aThread,
1154
- void * aPlatformData)
1155
+ uint32_t aMaxFrames, void * aClosure)
1155
1156
{
1156
- MOZ_ASSERT (!aThread);
1157
- MOZ_ASSERT (!aPlatformData);
1158
1157
return false ;
1159
1158
}
1160
1159
0 commit comments