我有一个使用最新版EurekaLog的Delphi 10项目.我目前正在使用EurekaLog来帮助我调试生产客户端中的问题.
我注意到EurekaLog没有注册线程中发生的错误.在我开始阅读之后,我发现我需要更改TThread
为TThreadEx
,并在我的Execute
override方法的开头添加以下代码.
SetEurekaLogStateInThread(ThreadID, true);
Run Code Online (Sandbox Code Playgroud)
尽管如此,当发生错误时,它不会在EL
文件中生成事件.
如果我添加ExceptionManager.StandardEurekaError('TThrdSincArquivos.Execute => ' + ex.Message);
的try..except
,它确实记录.但是堆栈跟踪显示为在我调用StandardEurekaLog()
的行上发生错误,而不是在实际发生错误的行上.这违背了整个事情的目的.
另一个问题是它显示了一个我不想要的对话框,因为错误发生在后台线程中.我只是想记录下来.我应该只在主线程上出现错误的对话框.
如何在线程中实现这些结果?
实际上使用正确的堆栈记录错误.
在主线程上,显示对话框,但在一个线程中,只记录没有对话框.
编辑
下面是我的EurekaLog多线程配置
这是我的线程声明:
unit ThrdSincArquivos;
interface
uses
System.Classes, System.SysUtils, System.Generics.Collections, REST.Client, REST.Types,
System.JSON, Data.DB, Datasnap.DBClient, FireDAC.Comp.Client, FireDAC.Stan.Param, System.SyncObjs, EBase, EExceptionManager, EClasses;
type
TThrdSincArquivos = class(TThreadEx)
private
Run Code Online (Sandbox Code Playgroud)
我的主题是创建
constructor TThrdSincArquivos.Create(pPrimeiraExec: boolean; tipoSincParam: TTipoSinc);
begin
inherited Create(true);
NameThreadForDebugging('TThrdSincArquivos');
primeiraExec := pPrimeiraExec;
tipoSinc := tipoSincParam;
executadoThreadSinc := false;
FreeOnTerminate := true
end;
Run Code Online (Sandbox Code Playgroud)
我执行的开始
procedure …
Run Code Online (Sandbox Code Playgroud) 我最近安装了Delphi XE7.当我第一次编译一个旧应用程序时,当我看到EXE的大小增加10MB时我的下巴掉了!
在'项目选项'中玩,我发现将'调试信息'设置为'有限调试信息'会将EXE大小减小到非常接近Delphi XE生成的EXE.也许在Delphi下,XE7'有限调试信息'相当于Delphi XE的'Debug Information',因为它产生相同的EXE大小?
那么,为什么完整的"调试信息"使得EXE如此之大(与XE相比)?我无法用有限的信息编译EXE(我猜)因为我想完全访问调试好东西(EurekaLog也需要它).
Embarcadero的文档没有说明"有限"和完整调试信息之间的区别.
EurekaLog文档适用于旧版本的Delphi,因此它没有明确说明我是否可以使用新选项(merciful)'有限调试信息'或完整的调试信息.我将不得不进行实验.
关于获取异常处理的调用堆栈有很多关于获取调用堆栈的帖子,我们有EurekaLog来处理它,但是我真的希望能够在运行时的任何时候获取堆栈,就像你在断点中放置一个断点一样. IDE.
遗留代码中某处的事件导致执行的函数正在执行它不应该执行的操作.虽然我们可以从调试输出中看到函数的名称,但是如果没有堆栈跟踪,我们无法分辨实际调用它的是什么.这不是一个例外,我们不想在该函数中引发异常,因此EurekaLog可以触发.
有没有办法获得调用堆栈没有任何异常?