【问题标题】:C# System.Diagnostics.StackFrame.GetFileName always return nullC# System.Diagnostics.StackFrame.GetFileName 始终返回 null
【发布时间】:2022-01-19 00:46:25
【问题描述】:

我用下面的代码来获取源代码的文件名

StackTrace trace = new StackTrace(true);
string fileName = string.Empty;
foreach (var frame in trace.GetFrames())
{
    string fileToCheck = frame.GetFileName();
    if (someLogicToCheckTheSuitableFile())
    {
        fileName = fileToCheck;
        break;
    }
}

当我在本地服务器上运行它时,它运行良好。但是当我在我的 linux 服务器上尝试它时,函数“GetFileName”总是返回 null。 有人可以给我一个建议吗?

【问题讨论】:

  • 您可能没有该名称,因为发布版本剥离了该名称或托管环境不允许它。

标签: c# system.diagnostics stack-frame


【解决方案1】:

StackFrame.GetFileName 方法

public virtual string? GetFileName ();

获取包含正在执行的代码的文件名。此信息通常是从可执行文件的调试符号中提取的。 source

完整的例子你可以找到here

在您构建应用程序后,VS 创建了 pdb 文件(在发布或调试中),其中包含有关代码调用和代码文件链接的信息。此信息存储在与可执行文件位于同一文件夹中的 ***.pdb 文件中。 您可以试验您的应用程序(或我在2 中链接的 MS 示例):在调试/发布中构建它,并使用 *.pdb 文件从 cmd/PS 运行应用程序,而无需。当 pdb 文件存在时 - 您将看到代码文件的链接,在您删除 pdb 文件后 - 不会显示有关您的代码的任何信息。

您可以禁用/启用创建 pdb 文件,如 here 所述

【讨论】:

  • 感谢您的回复!我试图将“便携式”设置为“调试信息”。 csproj 文件如下: portabletrue 它在我的本地服务器上唤醒,但在 linux 服务器上,它仍然为空
  • 'Portable'(跨平台)是“Full”的新格式(仅适用于 Windows)。 .pdb 文件是否存在于您的 .exe 附近的 linux 服务器上?
  • 我查过了。它存在。
  • .dll文件附近的.pdb文件,但是结果还是null
  • 我认为存在以下问题之一:pdb 文件不是来自同一个应用程序版本(更新或旧于可执行文件),或格式 pdb 文件与应用程序不匹配。如果您将在 Linux 服务器上使用 pdb 文件 MS 示例构建和执行,并且您将看到来自 pdb 的信息,这意味着您的应用程序可执行文件的 pdb 不正确。否则,您应该添加有关构建和生产环境的信息以更正确地回答
猜你喜欢
  • 2021-06-16
  • 2016-05-31
  • 2015-08-15
  • 2012-03-18
  • 2016-11-04
  • 2016-07-28
  • 2010-11-08
  • 2017-11-26
  • 2015-02-23
相关资源
最近更新 更多