标签: eurekalog

在没有与Eurekalog对话的情况下纠正线程内的记录

我有一个使用最新版EurekaLog的Delphi 10项目.我目前正在使用EurekaLog来帮助我调试生产客户端中的问题.

我注意到EurekaLog没有注册线程中发生的错误.在我开始阅读之后,我发现我需要更改TThreadTThreadEx,并在我的Executeoverride方法的开头添加以下代码.

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 multithreading eurekalog

9
推荐指数
1
解决办法
282
查看次数

什么是'有限的调试信息'?(完整的"调试信息"生成巨大的EXE文件)

我最近安装了Delphi XE7.当我第一次编译一个旧应用程序时,当我看到EXE的大小增加10MB时我的下巴掉了!

在'项目选项'中玩,我发现将'调试信息'设置为'有限调试信息'会将EXE大小减小到非常接近Delphi XE生成的EXE.也许在Delphi下,XE7'有限调试信息'相当于Delphi XE的'Debug Information',因为它产生相同的EXE大小?

那么,为什么完整的"调试信息"使得EXE如此之大(与XE相比)?我无法用有限的信息编译EXE(我猜)因为我想完全访问调试好东西(EurekaLog也需要它).
Embarcadero的文档没有说明"有限"和完整调试信息之间的区别.

EurekaLog文档适用于旧版本的Delphi,因此它没有明确说明我是否可以使用新选项(merciful)'有限调试信息'或完整的调试信息.我将不得不进行实验.

delphi delphi-xe eurekalog delphi-xe7

6
推荐指数
1
解决办法
859
查看次数

随时从EurekaLog获取调用堆栈

关于获取异常处理的调用堆栈有很多关于获取调用堆栈的帖子,我们有EurekaLog来处理它,但是我真的希望能够在运行时的任何时候获取堆栈,就像你在断点中放置一个断点一样. IDE.

遗留代码中某处的事件导致执行的函数正在执行它不应该执行的操作.虽然我们可以从调试输出中看到函数的名称,但是如果没有堆栈跟踪,我们无法分辨实际调用它的是什么.这不是一个例外,我们不想在该函数中引发异常,因此EurekaLog可以触发.

有没有办法获得调用堆栈没有任何异常?

delphi callstack delphi-xe2 eurekalog

1
推荐指数
1
解决办法
955
查看次数