【问题标题】:How to use Visual Studio to debug across a C# program calling a C++ dll?如何使用 Visual Studio 调试调用 C++ dll 的 C# 程序?
【发布时间】:2020-12-04 11:07:00
【问题描述】:

我正在 Visual Studio 2019 中编写一个 C# 应用程序,该应用程序调用一个 C++ dll(以处理一些 CUDA 编程),但我无法调试代码的两个部分。调试器在 C# 项目中工作正常,但没有在 C++ 项目中加载符号,即使它们都在同一个解决方案中运行并且都设置为 DEBUG。
需要明确的是,这不是调试 CUDA 代码的问题)

有什么想法可以继续吗?
我不确定它是否相关,但这是我正在使用的测试代码......

C#

[DllImport("HoughTest.dll", CallingConvention = CallingConvention.Cdecl)]  
        public static extern float sumArray([MarshalAs(UnmanagedType.LPArray)] float[] x, int n);  

private void button_Click(object sender, EventArgs e)  
        {  
           // break points placed in this routine do trigger  
            float[] x = new float[] { 0.5f, 1, 2, 3 };  
            float sum = sumArray(x, x.Length);  
            MessageBox.Show("Sum is "+sum);  
        }  

C++

extern "C" __declspec(dllexport) float sumArray(float* x, int n)  
    {  
        // break points placed in this routine do not trigger  
        float sum = 0;  
        for (int i = 0; i < n; i++)  
        {  
            sum += x[i];  
        }  
        return sum;  
    }  

【问题讨论】:

  • 您可以尝试运行第二个 Visual Studio 实例。将主项目设置为 C++ dll 之一。然后使用 attach 来处理,让它在编辑器中的 C++ 断点处中断。
  • 您确定本地符号路径设置正确吗?
  • 项目 > 属性 > 调试选项卡,勾选“启用本机代码调试”。您无法从托管代码单步执行本机代码,因此请在 C++ 函数上设置断点。如果该断点仍然是空的,则使用工具 > 选项 > 调试 > 常规,取消选中“仅我的代码”。
  • 谢谢汉斯 - 做得很好!
  • 嗯,这些选项是折衷的……因为它会影响断点、跟踪、编辑和继续以及在异常时停止。据我所知,不可能同时拥有两种语言的所有调试功能。

标签: c# c++ visual-studio debugging visual-studio-2019


【解决方案1】:

如何使用 Visual Studio 在调用 C++ 的 C# 程序中进行调试 dll?

只需为您添加一个答案,并感谢所有社区成员的帮助。

要在托管项目中调试本机 C++ 代码,目前实际上可以在 Visual Studio 上完成。你可以查看这个官方文档--Debug C# and C++ in the same debugging session

建议

1) 首先,在构建原生c++ dll项目之前,应确保平台与c#托管项目相同。

例如,C++ 项目是X64,您应该确保您的托管项目也使用x64

另外,在c++项目上右击-->Properties--> Debugging-->设置Debugger Type AutoMixed

2) 其次,在构建 c++ 项目以生成 dll 时,应将 c++ dll 及其 pdb 文件复制到托管项目中。

换句话说,当您使用 dllimport 引用 c++ DLL 时,您必须确保该路径中同时存在 dllpdb

3) 调试 C# 项目时,应选中托管项目 Properties-->Debug 下的选项 enable native code debugging

===========================

如果断点仍然没有命中,你应该尝试禁用工具下的Enable Just My Code选项-->选项- ->调试-->常规

除此之外,您还可以参考this similar issue获取更多帮助。

【讨论】:

  • 谢谢佩里,这是一个比我能做到的更好的综合答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多