我做了一个非常简单的方面,并在调试时发现了一个问题(参见代码)。我在方法出口上设置了一个断点,它实际上在“入口”方法中命中。 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");
}
}
答案 0 :(得分:3)
通常,当调试符号过期或与正在运行的可执行文件不匹配时,会发生这种情况。
我使用PostSharp并且之前没有见过这样的东西......你试过重建吗?或者删除输出文件夹然后构建?
编辑:
所以我跑了你的样本。如果将MyAspect
实现移动到另一个文件,当您开始调试代码时,断点将变为不可用,并显示以下消息:“断点当前不会被命中。没有可执行文件与此行关联...”< / p>
如果没有应用方面,则不会发生。所以是的,看起来像后期编译步骤中的某些内容确实会导致问题。
我会在这里留下这个答案,作为对问题的澄清。如果您认为它没用,我也可以删除它......
编辑2: 至于解决方法:将断点设置为上一行(而不是右括号),然后跳过方法中的最后一行代码......
答案 1 :(得分:0)
这可能是PostSharp的错误。您可以将其报告给http://www.postsharp.org/tracker。
答案 2 :(得分:0)
在搜索此问题的解决方案时,我偶然发现了这个问题。我有同样的问题,并发现了一些关于它的事情。
它看起来(我真的不知道)它与构建过程中发生的顺序有关。我的想法是关于构建/重建时发生的事情(在我的情况下清理无关紧要):
这意味着:.pdb与正在调试的代码不匹配。为什么我这么想?好吧,如果我在程序集上禁用了postharp,一切正常。当它启用时,简单的代码就像 “string str =”test“; 正如Nader Shirazie提到的“与可执行代码无关”。我不能同意。
我仍在寻找“真正的”解决方案。我当前的解决方法,禁用程序集的postharp,并不是真的令人满意,因为我也想调试方面。 也许它只是一个简单的设置。我无法想象像postharp这样的工具,它可以提高生产力和质量,使调试失败......任何人?
我可能是错的,但在我的情况下,这就是它的样子......
欢呼声, 延
答案 3 :(得分:0)
这似乎是因为PostSharp在编译项目时将代码“注入”到您的方法中,因此断点行和所有异常行号都被“X”行数量所取消。您可以查看反编译的.dll,并查看PostSharp注入代码库的所有代码,导致.pdb文件与.dll不同步