【问题标题】:Breakpoint never hit when dll would be called调用 dll 时断点永远不会命中
【发布时间】:2012-07-30 18:28:14
【问题描述】:

我已将托管 c++ dll 添加到我的 c#.net 项目中(使用“添加资源”);它发现我试图实例化的类很好,没有编译器错误。但不知何故,我知道我实例化的字段正在获得空引用异常。所以我在设置字段的方法的顶部放置了一个断点......它从未被命中。如果我使用 .dll 中的类注释掉该行,它将到达断点。取消注释,尽管被调用,但该方法永远不会执行。这里发生了什么?

dll 是 ManagedSpyLib,类是 ControlProxy,如果有帮助的话。该调用位于后台工作程序的 DoWork 方法中,该方法肯定是异步启动的——整个线程是否会在没有警告调试器的情况下静默崩溃?我该如何调试?

ETA:我在输出窗口或模块窗口中找不到任何关于 dll 的信息。一些谷歌搜索发现了一个修复:将目标更改为 .net 3.5 框架。但我并没有比以前更了解 WTF 正在发生的事情——我的代码有效,但现在我不知道为什么,这更令人费解。有人能解释一下这种现象吗?

【问题讨论】:

  • 调试行为与异常一致。是的,BGW 的 DoWork() 方法中的异常被吞没了。不要忘记在 RunWorkerCompleted 事件处理程序中测试 e.Error。或者使用 Debug + Exception, Throw 复选框让调试器停止。
  • 我不知道,你会从调试器告诉你的内容中了解得更好。否则,您会抱怨 NullReferenceExceptions。
  • @HansPassant 这是一个空引用,因为我期望在程序中被调用的方法根本没有运行,因为.....我不知道,但是有些与.net 4.0有关。我看不到“由于从未输入方法而没有命中断点”与 nullPointerException“一致”,因为我在访问对象之前放置了断点。
  • 断点未命中 => 代码未运行 => 变量未初始化 => NullReferenceException。

标签: c# c++ .net dll


【解决方案1】:

调试未知错误/未能在断点处停止的通用步骤:

确保您已为相关 DLL 加载了 PDB(调试->窗口->模块)。确保来源与您使用的版本匹配。

在调试时检查输出窗口中是否有任何可疑的痕迹(尤其是关于异常的痕迹)。

考虑中断所有异常(调试->异常-> CLR 异常的“抛出时”)。可能需要禁用“仅我的代码”(工具->选项->调试->仅我的代码)以中断所有异常。

【讨论】:

  • 好吧,这导致我通过谷歌进行了修复,但我更加困惑。查看问题编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多