Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在发布模式下显示.NET程序集堆栈跟踪中的行号_C#_.net_Visual Studio_Stack Trace_Line Numbers - Fatal编程技术网

C# 在发布模式下显示.NET程序集堆栈跟踪中的行号

C# 在发布模式下显示.NET程序集堆栈跟踪中的行号,c#,.net,visual-studio,stack-trace,line-numbers,C#,.net,Visual Studio,Stack Trace,Line Numbers,是否有方法显示在发布模式下生成/部署的.NET程序集的堆栈跟踪中的行 更新: 我的应用程序分为三个类库项目和一个ASP.NET网站项目。我试图追踪的错误是在三个类库项目中的一个。我只为类库项目部署了pdb文件,该项目正在生成未设置为对象错误实例的对象引用 行号仍然没有显示在堆栈跟踪中。我是否需要为所有项目部署pdb文件以获取堆栈跟踪中的行号 工作溶液 为每个应用程序部署pdb文件修复了行号问题。在生成/部署包中包含调试符号 进入要查看堆栈跟踪行号的项目的“属性”窗口。 单击“构建垂直”选项卡。

是否有方法显示在发布模式下生成/部署的.NET程序集的堆栈跟踪中的行

更新:

我的应用程序分为三个类库项目和一个ASP.NET网站项目。我试图追踪的错误是在三个类库项目中的一个。我只为类库项目部署了pdb文件,该项目正在生成未设置为对象错误实例的对象引用

行号仍然没有显示在堆栈跟踪中。我是否需要为所有项目部署pdb文件以获取堆栈跟踪中的行号

工作溶液


为每个应用程序部署pdb文件修复了行号问题。

在生成/部署包中包含调试符号

进入要查看堆栈跟踪行号的项目的“属性”窗口。 单击“构建垂直”选项卡。 选择发布配置。检查调试常量参数。 取消选中Optimize code参数以避免内联代码偶尔出现跟踪问题此步骤不是必需的。 按高级。。。按钮并选择输出->调试信息->仅pdb。 将生成的.pdb文件与程序集一起部署。 根据以下意见实施:
要检查的另一件事是在Package/PublishWeb部分中,也未选中“排除生成的调试符号”复选框
在VS 2008 Express中,我在项目属性->编译->高级编译选项下找到了它。

我的解决方案

将pdb文件复制到可执行文件所在的文件夹中

现在我可以在运行exe文件时查看行号

这就是原因


我在过去遇到过一些问题,我觉得需要使用发布版本部署PDB文件来跟踪错误。原因是,正如您所说,异常发生在一个非常大的方法中,我无法准确地指出它发生的位置

这可能表明该方法需要重构为更小、更细粒度的方法。这不是一个一刀切的答案,但这种方法在短期内对我很有用,我经常在重构和长期内发现缺陷


只是想一想。

在VS2012中,您还需要取消选中属性的Package/Publish Web部分中的Exclude generated debug symbol。

这每次都有效。您只需要对堆栈跟踪消息进行子串。真的很容易!此外,在vb.net中,您确实需要显示所有文件并包含pdb

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string
C版本:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}

是否必须将pdb文件与程序集一起部署?是。这就是调试符号和行号所在的位置。如果不需要,您可能不想公开此信息。使用它来调试客户端问题,是的。但你并不总是想这样做,因为调试信息可以提供敏感数据,并成为攻击向量。取决于你的应用程序是什么。@Carlo:Debug信息也适用于版本优化的代码,但是调试有些有限。然而,调用堆栈即使在优化的代码中也是相当可靠的,除了内联函数和局部情况外,尾部调用可能会丢失,因为调用xxx/ret序列被jmp xxx替换。另一件要检查的事情是在Package/Publish Web部分,排除生成的调试符号复选框也未选中。当你走的时候,在更粗略的地方,以更细的纹理投掷试扣。如果必须做出假设,则在这些函数的开头增加防护。通常说来,这是正确的,但是,有遗留问题,有程序员编写新的大型方法,有时大型方法实际上是最好的方法。拆分它会让人困惑或困惑。另外,即使是5行的方法——你将搜索范围缩小了5倍——因此PDB在生产中也是一个必须的恶魔,除非你愿意使用符号服务器——你发现了什么?如果不想发布完整答案,可以发布评论。如果是桌面应用,请确保已部署PDB文件