我使用RtlCaptureStackBackTrace
来调试我的应用程序的主线程中提出的异常,当它在客户端的PC上运行时。它只提供地址,但它足以定位大多数问题,除非主线程被冻结。
对于这种错误,我做了一个像这样的看门狗线程
procedure TWatchDog.Execute;
var
res: NativeInt;
begin
repeat
If not Terminated then sleep(1000);
res:=SendMessageTimeout(MainFormHandle,WM_NULL,0,0,SMTO_NOTIMEOUTIFNOTHUNG,10000,nil);
If (res=0) and (HangsReported<4) then begin
WasHanged:=true;
APIs.SendMessage('WatchDog *HANG DETECTED* (v.'+Version_Num+') codes: '+ GenCRushRep);
inc(HangsReported);
end;
until Terminated;
end;
函数GenCRushRep
返回RtlCaptureStackBackTrace
给出的最后16个堆栈帧,但它不包含导致主线程挂起的情况。
有没有办法从监视程序线程中的主线程中收集一些更有用的信息?