【问题标题】:Why aren't my breakpoints being hit for my MarshalByRefObject object?为什么我的 MarshalByRefObject 对象没有命中断点?
【发布时间】:2011-11-09 20:11:38
【问题描述】:

我在 Windows 7 上使用 IIS 7.0。我有一个派生自 MarshallByRefObject 的类。当我构建它时,它应该给我我的代理。我在有问题的对象上设置了断点。该类是从另一个由 IIS 处理的 GET 请求运行的类调用的。调用者在 IIS 工作进程 (w3wp.exe) 上运行并且它的断点被命中(即我在 [1] 和 [2] 处都有断点,但只有 [1] 处的断点被命中)。

public class Caller
{
    public void Process()
    {
        var callee = new Callee();
        callee.Method(); // [1]
    }
}

public class Callee : MarshallByRefObject
{
    public void Method()
    {
        DoSomething(); // [2]
    }
}

【问题讨论】:

  • 被调用者在哪里运行?您的调试器是否也附加到该进程?您是否收到有关未加载符号的任何错误/警告消息?
  • 被调用者是否在不同的进程/应用程序中?
  • @leppie 我不这么认为。它们应该在同一个进程中。
  • @FyodorSoikin 我相信这两个类都在 IIS 工作进程(w3wp)中运行
  • 通常当有陌生感时,会有错误的假设。我猜我下面的答案最终证明是正确的。你能告诉我们MBRO的实际创建吗?如果您没有跨越进程边界(或至少是 AppDomain 边界),那么您使用 MBRO 到底是为了什么?

标签: c# debugging iis .net-remoting


【解决方案1】:

因为您的 MBR 上的方法不在同一个进程中执行(我假设您不只是在单个进程中跨 AppDomains)。您只有对代理的引用,但方法主体实际上并未在调用方 AppDomain 中执行。

检查您是否已附加到可能存在的服务进程。

【讨论】:

  • 这取决于您的 MBRO 创建代码。 MBRO 用于在同一进程内或跨进程跨越 AppDomain 边界。
  • @RusselMcClure 上面的代码与所讨论的代码完全相同,只是 Caller 和 Callee 的名称是明确组成的。但是没有额外的疯狂。它只是构造对象,然后调用方法。
  • 必须有一些疯狂,否则调试器很容易在 [2] 上停止,如果它可以在 [1] 上停止,并且如您所说,它全部在单个 AppDomain 中执行。好吧,如果我证明是对的,请过来拿走我的 -1。
  • 这不是我的 -1。那是别人的。但我给了你一个 +1 并标记你的问题是正确的。
【解决方案2】:

你如何引用被调用者?我假设他们不在同一个项目中,所以检查一下:

  • 两个项目均已正确构建
  • 您的系统上只有一个 Callee 项目可执行文件(dll 或 exe)实例,包括 GAC。您应该使用 GacUtil 检查您的程序集是否在 GAC 中(google 一下)。
  • Callee 项目是在调试模式下构建的。

【讨论】:

  • 为什么 DLL 必须在 GAC 中才能进行这种调试? Callee 代码正在运行,Visual Studio 并没有告诉我它不会被命中。它只是没有击中。
  • 不,它不应该在 GAC 中。但如果它在 GAC 中,它将从那里加载,您的调试器会错过它。所以我的意思是:确保您的程序集不在 GAC 中,而是从调试器可以找到它的位置加载。顺便说一句,如果它没有签名,它就不能交给 GAC。
  • 哦,我刚刚读到“被调用者代码正在运行”:它们都在不同的进程中吗?在那种情况下,两者都在同一个调试器中运行吗?我的注释 a) 到 c) 在这种情况下仍然适用,但另外,请在同一个调试器中运行它们。
  • 这次他们实际上是在同一个进程中。被调用者也被用于其他进程,但被调用者所在的 DLL 被调用者直接引用。也就是说,类是通过反射动态加载的。
  • 我猜你是在动态加载它——这是所有调试问题的根源。检查那些 a-c,但可能还有其他问题。您还可以执行 MessageBox.Show() 并询问自己程序集的位置,以查看它在哪里...
猜你喜欢
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多