目前,我正在测试在Delphi XE 3中使用的各种日志记录框架。由于使用Log4Delphi使得在实现现有程序方面的问题最少,因此,我目前正在尝试获取有关Logmessage的其他信息。现在,我想要的是其他信息,例如方法名称和代码行。我已经发现Jedi代码库的调试功能可能会提供此类数据。可悲的是,我无法弄清楚要使它按我想要的方式工作。

因为它是我目前正在使用此功能:

function CurrentFunctionName: string;
begin
  Result := jcldebug.getlocationInfoStr(Caller(1));
end;


但是,尽管我发现的代码示例提供了以下数据:

[004223A7] jcldebugtest.SomeProcedure (Line 10, "jcldebugtest.dpr")


当我尝试在程序中使用它时,我获得的所有数据如下所示:

(00E8EF63) [0128FF63]


我不完全了解这种行为的原因,因此,如果有人可以向我解释如何正确执行此操作以及我的错误/误解所在的位置,那将非常好。

最佳答案

您需要进入Project->Options->Linker,打开Detailed映射文件,然后构建(而不是编译!)您的项目。映射文件信息是将原始地址转换为代码中特定位置所必需的。

您可以使用JCL\Examples\Windows\Debug\SourceLoc文件夹中的示例对此进行测试。如果生成并运行SourceLocExample.dpr,则单击“ Caller()”,“地址查找”或“堆栈转储”按钮将仅返回内存地址。然后按照上述说明启用详细的映射文件,从IDE的菜单中执行Project->Build,然后再次运行示例,单击相同的按钮并比较输出。

然后,您可以(可选)使用Project->JCL Debug expert将调试信息嵌入到可执行文件中,而不必将其作为需要分发的单独文件提供。

关于delphi - 结合Log4Delphi和jcl调试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19450140/

10-11 18:48