Bug 1705308 - Invoke callback from WalkStackMain64 instead of going through expandable on-stack buffers - r=glandium

Differential Revision: https://phabricator.services.mozilla.com/D112169
This commit is contained in:
Gerald Squelart 2021-04-20 04:37:04 +00:00
Родитель 4bf34ae6d1
Коммит e7657403a3
1 изменённых файлов: 11 добавлений и 40 удалений

Просмотреть файл

@ -117,14 +117,10 @@ struct WalkStackData {
HANDLE process;
HANDLE eventStart;
HANDLE eventEnd;
void** pcs;
uint32_t pc_size;
uint32_t pc_count;
uint32_t pc_max;
void** sps;
uint32_t sp_size;
uint32_t sp_count;
uint32_t maxFrames;
CONTEXT* context;
MozWalkStackCallback callback;
void* callbackClosure;
};
CRITICAL_SECTION gDbgHelpCS;
@ -312,6 +308,8 @@ static void WalkStackMain64(struct WalkStackData* aData) {
FrameSkipper skipper(aData->firstFramePC);
uint32_t frames = 0;
// Now walk the stack.
while (true) {
DWORD64 addr;
@ -405,17 +403,10 @@ static void WalkStackMain64(struct WalkStackData* aData) {
continue;
}
if (aData->pc_count < aData->pc_size) {
aData->pcs[aData->pc_count] = (void*)addr;
}
++aData->pc_count;
aData->callback(++frames, (void*)addr, (void*)spaddr,
aData->callbackClosure);
if (aData->sp_count < aData->sp_size) {
aData->sps[aData->sp_count] = (void*)spaddr;
}
++aData->sp_count;
if (aData->pc_max != 0 && aData->pc_count == aData->pc_max) {
if (aData->maxFrames != 0 && frames == aData->maxFrames) {
break;
}
@ -456,32 +447,12 @@ static void DoMozStackWalkThread(MozWalkStackCallback aCallback,
data.firstFramePC = aFirstFramePC;
data.thread = targetThread;
data.process = ::GetCurrentProcess();
void* local_pcs[1024];
data.pcs = local_pcs;
data.pc_count = 0;
data.pc_size = ArrayLength(local_pcs);
data.pc_max = aMaxFrames;
void* local_sps[1024];
data.sps = local_sps;
data.sp_count = 0;
data.sp_size = ArrayLength(local_sps);
data.maxFrames = aMaxFrames;
data.context = aContext;
data.callback = aCallback;
data.callbackClosure = aClosure;
WalkStackMain64(&data);
if (data.pc_count > data.pc_size) {
data.pcs = (void**)_alloca(data.pc_count * sizeof(void*));
data.pc_size = data.pc_count;
data.pc_count = 0;
data.sps = (void**)_alloca(data.sp_count * sizeof(void*));
data.sp_size = data.sp_count;
data.sp_count = 0;
WalkStackMain64(&data);
}
for (uint32_t i = 0; i < data.pc_count; ++i) {
(*aCallback)(i + 1, data.pcs[i], data.sps[i], aClosure);
}
}
MFBT_API void MozStackWalkThread(MozWalkStackCallback aCallback,