【问题标题】:No Symbols loaded in mixed C# C(win32) project using VS2010使用 VS2010 在混合 C# C(win32) 项目中未加载符号
【发布时间】:2016-02-03 16:42:38
【问题描述】:

我的项目有几个新的 C# 模块和一个使用 win32 系统调用编译的 C 模块(不是 C++)。我正在使用 PInvoke 互操作层从 C# 调用 C 代码。 C 函数被调用。

所有模块都写入单个 bin 目录并且都写入 pdb 文件。

在运行时,然后在调用 C.dll 之前的断点处停止,我看到 C 模块中的断点被禁用。查看 Debug|Windows|Modules 列表,即使在执行调用之后,我也没有看到 C.dll 模块加载。

另一个事实:在解决方案|属性|配置属性|配置中显示使用 Platform = "Any CPU" 的 C# 模块和使用 "Win32" 的 C 模块

为什么模块没有加载,为什么它的符号没有加载?

谢谢, 最大

【问题讨论】:

    标签: c# c debugging visual-studio-2010


    【解决方案1】:

    我综合了多个来源的答案。

    • 您是否正在运行调试配置?
      在解决方案检查中:SolnExplorer|Solution|Properties|ConfigurationProperties|配置 = 调试
      和:SolnExplorer|解决方案|属性|配置属性|配置|ProjectConfig[]=调试 -->注意:虽然断点可以与发布配置一起使用,但有时行可能会被优化或重新排列。

    • 您是否正在生成调试信息? 在 C# 项目中:SolnExplorer|Project|Properties|ConfigurationProperties|Linker|Debugging|Generate Debug Info=YES
      在 C++ 项目中:SolnExplorer|Project|Properties|ConfigurationProperties|C/C++|Debug Information Format = Program Database(/Zi)
      -->注意:检查命令行参数是值得的。

    • 一切都在重建吗?如果 PDB 不同步,调试器可能无法加载符号:
      在解决方案中:SolnExplorer|Solution|Properties|Configuration Properties|Build=TRUE(Checked) 适用于所有项目。

    • 可以调试非托管代码吗?
      在 C# 项目中:SolnExplorer|Project|Properties|Debug|启用非托管代码调试 = TRUE(Checked)
      在 C/C++ 项目中:SolnExplorer|Properties|Configuration Properties|Debugging|Debugger Type = Mixed

    • 文件是否放置在您认为的位置?我使用单个 bin\debug 目录来收集所有项目 DLL 和 PDB。
      在 C# 项目中:SolnExplorer|Project|Properties|Build|Output Path = ..\bin\debug
      在 C/C++ 项目中:SolnExplorer|Project|Properties|ConfigProp|Linker|OutputFile = ..\bin\debug\$(TargetName)$(TargetExt)

    • 旧文件是否会妨碍您? 检查 bin 目录中所有输出文件的时间戳。确保它们是上次重建时的状态。
      有人建议删除所有 bin 和 obj 目录。这可能是值得的,只是为了看到旧文件没有被放置。检查时间和日期戳也应该这样做。

    • DLL 是否已加载?如果断点被禁用,可能是因为 DLL 尚未加载。 检查菜单|调试|Windows|模块。
      在模块名称中查找 dll。
      在同一模块窗口中,确保文件从正确的路径加载。
      如果程序集在多个程序之间共享,则可以从 GAC 加载它。
      -->注意:您可以在需要之前预加载 C/C++ DLL。使用:IntPtr lpDLL = LoadLibrary(myLibraryName);

    【讨论】:

    • 不错的列表,如果我在今晚遇到同样的问题后可以添加另一个,请确保 C++ 项目(如果它支持 CLR)不针对高于托管 C# 项目的框架;符号将“加载”并显示在模块列表中,但不会被断点/源文件使用,失败并出现“未加载符号”错误,导致您走错路!
    • 如果有人会来寻找此类问题的解决方案,我会提供额外的答案:如果您通过 Debug>Attach To Process 附加调试器,请在单击“附加”之前“附加到进程”对话框,确保选择调试器可以附加到的适当代码类型。
    • 你是我的英雄!谢谢你的美丽清单!让我再次出发。
    • 调试器类型“混合”是我的问题,使用 .NET dll 运行 C++ 项目。 +1
    • 美丽的名单:)。你救了我很多挫折:)。
    【解决方案2】:

    我在 C# 中有一个带有 C++ DLL 的 Windows 服务。我看到的问题是 Max 指出的:

    • DLL 工作正常,但从未出现在“模块”窗口中。

    我做了很多搜索,这是一个很好的列表,与许多其他来源的信息相匹配。

    为了明确 ikh 的注释:

    • “自动”对我不起作用,但明确设置“本机”和 “附加”对话框中的“托管”代码有效。

    【讨论】:

      【解决方案3】:

      这是我的 50 美分。就我而言,我的 c++/cli 项目的 pdb 文件似乎不再更新,而我的 c# 项目的 pdb 文件却是。 这可能会使它们无效并使调试器无法加载它们。

      我记得我已经移动了我的项目的源代码库。经过一番摸索后,我想到一些绝对路径问题可能是问题所在。运行git clean -dfx 为我解决了这个问题。

      【讨论】:

        猜你喜欢
        • 2011-07-11
        • 1970-01-01
        • 2011-03-20
        • 2011-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多