4

我做了一个很简单的方面,调试的时候发现了一个问题(见代码)。我在方法出口上设置了一个断点,它实际上在“入口”方法内部。PostSharp 1.5,Visual Studio 2008 SP1
这是一个已知的错误,是否有任何解决方法?

class Program
{
    [MyAspect]
    static void Main(string[] args)
    {
        Console.WriteLine("body");
    } // setting breakpoint here
}

[Serializable]
class MyAspect : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionEventArgs eventArgs)
    { // hits here actually! (debug mode)
        Console.WriteLine("entry"); // hits here actually! (release mode)
    }

    public override void OnExit(MethodExecutionEventArgs eventArgs)
    {
        Console.WriteLine("exit");
    }
}
4

4 回答 4

3

这通常发生在调试符号过期或与正在运行的可执行文件不匹配时。

我使用 PostSharp,以前从未见过这样的东西……你尝试过重建吗?还是删除您的输出文件夹然后构建?

编辑:

所以我运行了你的样本。如果将MyAspect实现移动到另一个文件,当您开始调试代码时,断点将变为不可用,并显示以下消息:“断点当前不会被命中。没有可执行文件与此行关联......”

如果没有应用方面,它就不会发生。所以是的,看起来编译后步骤中的某些东西确实会导致问题。

我将把这个答案留在这里作为对问题的澄清。如果你觉得没用,我也可以删掉。。。

编辑2:至于解决方法:将断点设置为上一行(不在右大括号上),然后跳过方法中的最后一行代码...

于 2009-09-08T05:33:04.687 回答
0

这可能是 PostSharp 的一个错误。您可以将其报告给http://www.postsharp.org/tracker

于 2009-09-08T06:11:26.420 回答
0

在寻找这个问题的解决方案时,我偶然发现了这个线程。我有同样的问题,并发现了一些东西。

看起来(我真的不知道)它与构建过程中发生的事情的顺序有关。我的想法是构建/重建时会发生什么(在我的情况下清理并不重要):

  • 构建程序集
  • 为他们创建 .pdb
  • 再次构建,应用 postsharp 代码
  • .pdb 不再创建(我猜!!)

这意味着:.pdb 与正在调试的代码不匹配。为什么我会这样想?好吧,如果我在程序集中禁用 postsharp,一切正常。当它启用时,像“string str =”test“这样的简单代码是,正如Nader Shirazie所说的“与可执行代码无关”。我不能同意。

我仍在寻找“真正的”解决方案。我目前的解决方法是禁用程序集的 postsharp,这并不令人满意,因为我当然也想调试这些方面。也许这只是一个简单的设置。我无法想象像 postsharp 这样的工具,它可以提高生产力和质量,使调试失败……有人吗?

我可能是错的,但这就是我的情况。

于 2013-02-14T06:37:06.260 回答
0

这似乎是因为 PostSharp 在您编译项目时将代码“注入”到您的方法中,因此断点行和所有异常行号都偏离了“X”行。您可以查看反编译的 .dll 并查看 PostSharp 注入到您的代码库中导致 .pdb 文件与 .dll 不同步的所有代码

于 2015-01-22T21:25:25.333 回答