我的项目有几个新的C#模块和一个使用win32系统调用编译的C模块(不是C ++)。我正在使用PInvoke互操作层从C#调用C代码。 C函数被调用。
所有模块都写入单个bin目录和所有写入pdb文件。
在运行,然后在调用C.dll之前在断点处停止时,我看到C模块中的断点被禁用。查看Debug | Windows | Modules列表,即使在执行调用后,我也看不到C.dll模块已加载。
另一个事实:在解决方案|属性|配置属性|配置中显示使用Platform =“Any CPU”的C#模块和使用“Win32”的C模块
为什么不加载模块,为什么不加载它的符号?
谢谢, 最大
答案 0 :(得分:12)
我从多个来源整合了答案。
您是否正在运行调试配置?
在解决方案中检查:SolnExplorer |解决方案|属性| ConfigurationProperties |配置=调试
和:SolnExplorer |解决方案|属性| ConfigurationProperties |配置| ProjectConfig [] =调试
- >注意:虽然断点适用于发布配置,但有时可以优化或重新排列行。
您是否正在生成调试信息?
在C#项目中:SolnExplorer |项目|属性| ConfigurationProperties |链接器|调试|生成调试信息=是
在C ++项目中:SolnExplorer |项目|属性| ConfigurationProperties | C / C ++ |调试信息格式=程序数据库(/ Zi)
- >注意:检查命令行参数是值得的。
一切都在重建吗?如果PDB不同步,则调试器可能无法加载符号:
在解决方案中:所有项目的SolnExplorer |解决方案|属性|配置属性| Build = TRUE(已选中)。
您可以调试非托管代码吗?
在C#项目中:SolnExplorer |项目|属性|调试|启用非托管代码debugging = TRUE(已检查)
在C / C ++项目中:SolnExplorer |属性|配置属性|调试|调试器类型=混合
文件是否放在您认为的位置?我使用单个bin \ debug目录来收集所有项目DLL和PDB
在C#项目中:SolnExplorer |项目|属性|构建|输出路径= .. \ bin \ debug
在C / C ++项目中:SolnExplorer |项目|属性| ConfigProp |链接器| OutputFile = .. \ bin \ debug \ $(TargetName)$(TargetExt)
旧文件是否妨碍了? 检查bin目录中所有输出文件的时间戳。确保它们是最后一次重建时的结果 有些人建议吹掉所有的bin和obj目录。这可能是值得的,只是为了看到旧文件没有铺设。检查时间和日期标记也应该这样做。
DLL已加载吗?如果禁用断点,可能是因为尚未加载DLL。 检查菜单|调试| Windows |模块 在模块名称中查找dll 在相同的模块窗口中,确保从正确的路径加载文件 如果程序集在多个程序之间共享,则可以从GAC加载 - >注意:您可以在需要之前预加载C / C ++ DLL。使用:IntPtr lpDLL = LoadLibrary(myLibraryName);
答案 1 :(得分:0)
我在C#中有一个带有C ++ DLL的Windows服务。我看到的问题是Max注意到的:
我做了很多搜索,这是一个很好的列表,与许多其他来源的信息相匹配。
明确指出ikh的注意事项:
答案 2 :(得分:0)
这是我的五十美分。在我的情况下,似乎我的c ++ / cli项目的pdb文件不再更新,而我的c#项目的pdb文件是。 这可能使它们无效并使调试器无法加载它们。
我记得已经移动了我的项目的源代码库。经过一点点的讨论后,我发现一些绝对路径问题可能就是问题所在。运行git clean -dfx
为我解决了这个问题。